取消当前正在进行的所有接口请求

需求: 当请求接口过多,功能点切换的时候需要停止之前的请求接口。

实现:

  • axios.ts 实例化拦截器,自动给每个请求注入 controller.signal,并存入 manager
  • 在响应或错误阶段移除 controller

代码实现:

typescript 复制代码
export class RequestManager {
  private controllers = new Set<AbortController>();
  add(c: AbortController) { this.controllers.add(c); }
  delete(c: AbortController) { this.controllers.delete(c); }
  cancelAll(reason = 'Canceled by RequestManager') {
    for (const c of this.controllers) c.abort(reason as any);
    this.controllers.clear();
  }
}
export const requestManager = new RequestManager();
arduino 复制代码
api.interceptors.request.use((config) => {
  // 如果外部已传入 signal,就复用;否则创建新的
  if (!config.signal) {
    const controller = new AbortController();
    config.signal = controller.signal;
    // 把 controller 挂到 config 以便响应阶段访问
    (config as any).__controller = controller;
    requestManager.add(controller);
  } else {
    // 若用户自带 signal,也可选择登记但无法拿到 controller
  }
  return config;
});
typescript 复制代码
api.interceptors.response.use(
  (res) => {
    const controller = (res.config as any).__controller as AbortController | undefined;
    if (controller) requestManager.delete(controller);
    return res;
  },
  (error) => {
    const cfg = error.config || {};
    const controller = (cfg as any).__controller as AbortController | undefined;
    if (controller) requestManager.delete(controller);
    return Promise.reject(error);
  }
);
ini 复制代码
requestManager.cancelAll());
相关推荐
zzzzzz3102 分钟前
别急着把动效组件搬进页面:从 react-bits 看 React 动效库该怎么评估
前端·react.js·开源
李姆斯7 小时前
为啥Agent在coding表现这么好,但是在别的领域就是差的不少?
前端·agent·ai编程
鱼与宇10 小时前
前端Web(html+css+js+vue3)
前端
雪芽蓝域zzs11 小时前
(六)打包优化 + Nginx 部署完整配置 + 项目收尾
前端·vue.js
研☆香11 小时前
聊一聊前端的常见字 关键字
开发语言·前端·javascript
东风破_12 小时前
JWT 1:从一个登录请求开始,理解 React 项目里的 API 层与 Mock
前端·后端
东风破_12 小时前
JWT 3:为什么 Token 要放进 Authorization?Axios 拦截器到底解决了什么?
前端·后端
东风破_12 小时前
JWT 5:路由守卫是什么?把整个 JWT 登录鉴权流程串起来
前端·后端
东风破_12 小时前
JWT 2:HTTP 是无状态的,为什么登录成功后还要给 Token?
前端·后端
东风破_12 小时前
JWT 4:Zustand 到底解决了什么?为什么登录状态要放进 Store?
前端·后端