封装自带取消请求功能的fetch请求
封装自带取消请求功能的 fetch 请求
为了防止我们的同一个请求被多次请求多次,而我们往往只是想要最后一次的结果,这就导致我们前面的请求都是无效请求,所以我们需要一个方法来取消前面的请求,可以参考这篇文档
如何取消我们的请求 ˝
❓:这是我自己尝试的封装,还存在一些问题,下面会说明
💡:
import { rejects } from "assert";
import React from "react";
import { message } from "antd";
type HttpMethod = "GET" | "POST" | "PUT" | "DELETE"; // 可以根据需要扩展
type FetchOptions = RequestInit & { method?: HttpMethod };
/* 自带消除上次的的接口 */
const debouncedFetch = (() => {
let controller: AbortController | null = null;
let timeoutId: ReturnType<typeof setTimeout> | null = null;
return async (
url: string,
options: FetchOptions = {},
delay: number = 300
): Promise<Response> => {
// 如果已经存在一个请求(controller不为空),则取消前一个请求
if (controller) {
controller.abort();
}
// 清除上一个计时器
if (timeoutId) {
clearTimeout(timeoutId);
}
// 为新请求创建一个新的AbortController
controller = new AbortController();
const fetchOptions: FetchOptions = {
...options,
signal: controller.signal,
}; // 使用新的signal
// 设置一个计时器
timeoutId = setTimeout(() => {
controller = null;
timeoutId = null;
}, delay);
try {
const response = await fetch(url, fetchOptions);
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`);
}
return response; // 返回Response对象,调用者可以根据需要处理(例如调用.text()或.json())
} catch (err) {
if (err.name === "AbortError") {
console.log("请求已被取消");
return new Promise((_, rejects) => rejects(false));
} else {
console.error("Fetch error:", err);
}
// throw err;
}
};
})();
export default debouncedFetch;
❓: 一般我们请求取消之后,应该只是网络请求(已取消),我们不需要再进行而外的返回和操作
💡:但是我这里写了返回的是一个 reject(false),所以取消之后,我们如果在我们发送请求的地方进行 catch 到我们的结果 false
## 希望内容对你有帮助,如果有错误请联系我 q: 1911509826,感谢支持
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2022-01-19 React笔记——第二篇Ref
2022-01-19 React笔记——第一篇this.setState()