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"//判断这个错误是否是取消请求导致的
相关推荐
@PHARAOH1 小时前
WHAT - GitLens vs Fork
前端
yqcoder2 小时前
前端性能优化:如何减少重绘与重排?
前端·性能优化
洋子2 小时前
Yank Note 系列 13 - 让 AI Agent 进入笔记工作流
前端·人工智能
wenzhangli74 小时前
Ooder A2UI 核心架构深度解析:WEB 拦截层的设计与实现
前端·架构
前端百草阁5 小时前
【前端性能优化全链路指南】从开发编写到构建运行的多维度实践
前端·性能优化
女生也可以敲代码5 小时前
AI时代下的50道前端开发面试题:从基础到大模型应用
前端·面试
ZhengEnCi5 小时前
M5-markconv自定义CSS样式指南 📝
前端·css·python
IT_陈寒6 小时前
SpringBoot自动配置的坑差点让我加班到天亮
前端·人工智能·后端
xingpanvip6 小时前
星盘接口开发文档:星相日历接口指南
android·开发语言·前端·css·php·lua
@PHARAOH6 小时前
WHAT - GitLens supercharged 插件
前端