axios全局重复请求取消

目的

避免重复请求,提高运行效率,在全局统一处理减少代码量

实现思路

具体实现

js 复制代码
import axios from "axios";
import { getKey } from "./getkey";
export const request = axios.create({
  baseURL: import.meta.env["KING_BASE_URL"],
});

const cacheMap = new Map();
// 添加请求拦截器
request.interceptors.request.use(
  function (config) {
    config.headers.icode = "hellosunday";
    const key = getKey(config);
    const controller = new AbortController();
    config.signal = controller.signal;
    console.log(cacheMap.has(key));
    if (cacheMap.has(key)) {
      console.log(cacheMap.get(key));
      cacheMap.get(key)();
    }
    cacheMap.set(key, controller.abort);
    console.log(cacheMap);

    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  },
);

// 添加响应拦截器
request.interceptors.response.use(
  function (response) {
    const key = getKey(response.config);
    if (cacheMap.has(key)) {
      cacheMap.delete(key);
    }
    console.log("响应成功");
    return response;
  },
  function (error) {
    const key = error.config ? getKey(error.config) : null;
    if (key) {
      cacheMap.delete(key); // 无论成功或失败,请求结束后都应清理
    }
    if (error.code === "ERR_CANCELED") {
      return Promise.reject({ statusText: "请求正在进行中" });
    }
    return Promise.reject(error);
  },
);

取消请求的API

js 复制代码
// 为新请求创建 controller 用于取消请求
const controller = new AbortController();
//标记请求可以被取消 config为请求的配置 注意这个属性必须是controller 
config.signal= controller .signal
//cancelToken.abort() 取消标记的请求
cache.set(key, controller.abort)
取消请求会进入响应拦截器的错误函数 也就是第二个函数
error.code === "ERR_CANCELED"//判断这个错误是否是取消请求导致的
相关推荐
军军君015 小时前
Three.js基础功能学习十六:智能黑板实现实例三
前端·javascript·css·vue.js·3d·前端框架·threejs
海上彼尚5 小时前
SVG矢量图形快速入门
前端·html5
嗷o嗷o5 小时前
Android App Functions 深入理解
前端
UXbot5 小时前
AI原型设计工具评测:从创意到交互式Demo,5款产品全面解析
前端·ui·设计模式·ai·ai编程·原型模式
落魄江湖行5 小时前
硅基同事埋的坑,我用2小时才填平:Nuxt 4 路由踩坑:可选参数 [[id]] 与 [id] 的区别
前端
一勺菠萝丶5 小时前
管理后台使用手册在线预览与首次登录引导弹窗实现
java·前端·数据库
军军君015 小时前
Three.js基础功能学习十四:智能黑板实现实例一
前端·javascript·css·typescript·前端框架·threejs·智能黑板
小村儿5 小时前
连载05-Claude Skill 不是抄模板:真正管用的 Skill,都是从实战里提炼出来的
前端·后端·ai编程
xiaotao1315 小时前
JS new 操作符完整执行过程
开发语言·前端·javascript·原型模式
robch5 小时前
python3 -m http.server 8001直接启动web服务类似 nginx
前端·nginx·http