【axios取消请求】如何在token过期后取消未响应的请求

功能背景:

我们在实际项目中通常会遇到登录过期后会跳登录页的情况,回跳过程会根据接口请求的状态码判断是否登陆状态过期,并给出用户提示,如果此时存在多个请求接口同时调用,就会同时报出多个登录过期的提示,如何避免多个提示同时报出的情况呢?那我们就需要用到取消接口请求的功能

方法:

我们基于axios提供的AbortController对象(fetch提供的原生API)来实现这一功能

步骤:

1.创建接口请求映射表
javascript 复制代码
let abortControllers = new Map()
2.在请求拦截器中存储键值对
javascript 复制代码
Axios.interceptors.request.use(
    (config) => {
        const controller = new AbortController()
        const signal = controller.signal
        const requestKey = `${config.url}`
        // 请求地址与控制器绑定
        abortControllers.set(requestKey, controller)
        config.metadata = { signal, requestKey } // 自定义字段用于存储
        return config
    },
    (error) => {
        return Promise.reject(error.data.error.message)
    }
)
3.响应拦截其中判断是否过期
javascript 复制代码
Axios.interceptors.response.use(
    (res) => {
        if (res.status === 200) {
            if (res.data.code == '10008') {
                ElMessage.warning('登录已过期,请重新登录!')
                // 取消所有还未执行的接口请求
                abortControllers.forEach((controller) => controller.abort())
                abortControllers.clear() // 清空控制器映射
                router.push('/login')
                return
            } else {
                // 完成的接口在映射表中删除
                const requestKey = `${res.config.url}`
                abortControllers.delete(requestKey)
                return res.data
            }
        }
    },
    (error) => {
        // 出错的接口在映射表中删除
        const requestKey = `${error.config.url}`
        abortControllers.delete(requestKey)
        return Promise.reject(error.response.status)
    }
)
相关推荐
weixin_40809967几秒前
【实战教程】EasyClick 调用 OCR 文字识别 API(自动识别屏幕文字 + 完整示例代码)
前端·人工智能·后端·ocr·api·安卓·easyclick
PD我是你的真爱粉1 分钟前
Redis 持久化、过期删除、淘汰策略与内存碎片全解析
java·redis·bootstrap
Bigger4 分钟前
第四章:我是如何扒开 Claude Code 记忆与上下文压缩机制的
前端·claude·源码阅读
Percep_gan6 分钟前
在芋道自定义数据权限
java·数据库
哆啦阿梦6 分钟前
Java AI 应用工程师 - 完整技能清单
java·开发语言·人工智能
还在忙碌的吴小二7 分钟前
在 Mac 上安装并通过端口调用 Chrome DevTools MCP Server(谷歌官方 MCP 服务器)
服务器·前端·chrome·macos·chrome devtools
VT LI8 分钟前
Lua 源码执行流程全解析:词法分析、语法分析、字节码生成、虚拟机执行与垃圾回收
java·开发语言·lua
凤山老林2 小时前
04-Java JDK, JRE和JVM
java·开发语言·jvm
灵感__idea8 小时前
Hello 算法:贪心的世界
前端·javascript·算法
camellias_8 小时前
【无标题】
java·tomcat