axios 取消请求 版本是1.7.5

从 v0.22.0 开始,Axios 支持 AbortController 以 fetch API 的方式取消请求

bash 复制代码
官方例子
const controller = new AbortController();

axios.get('/foo/bar', {
   signal: controller.signal
}).then(function(response) {
   //...
});
// cancel the request
controller.abort()
bash 复制代码
request.js

import axios from 'axios'
import { ElNotification, ElMessageBox, ElMessage, ElLoading } from 'element-plus'

const errorCode = {
  '401': '认证失败,无法访问系统资源',
  '403': '当前操作没有权限',
  '404': '访问资源不存在',
  'default': '系统未知错误,请反馈给管理员'
}

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
  // 超时
  timeout: 10000
})
// 声明缓存请求的集合
 const pendingRequest = new Map();
//  基于请求的url和method 生成请求key
 const generateRequestKey = (config) => {
  const { method,url } = config;
  return [ method,url ].join('&')
 }
 // 缓存正在penging的请求
 const addPendingRequest = (config)=>{
  const requestKey = generateRequestKey(config);
  if(pendingRequest.has(requestKey)){
     const controller = pendingRequest.get(requestKey);
     controller.abort()
     pendingRequest.delete(requestKey);
  }
  const controller = new AbortController();
  config.signal = controller.signal;
  pendingRequest.set(requestKey,controller)
 }
 // 删除请求集合
 const removePendingRequest = (config)=>{
  const requestKey = generateRequestKey(config);
  if(pendingRequest.has(requestKey)){
     pendingRequest.delete(requestKey);
  }
 }
// request拦截器
service.interceptors.request.use(config => {
  // 是否需要设置 token
  addPendingRequest(config)
  return config
}, error => {
  console.log(error)
  Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(res => {
  removePendingRequest(res.config)
  // 未设置状态码则默认成功状态
  const code = res.data.code || 200;
  // 获取错误信息
  const msg = errorCode[code] || res.data.message || errorCode['default']
  if (code == 401) {
    return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
  } else if (code == 500) {
    ElMessage({ message: msg, type: 'error' })
    return Promise.reject(new Error(msg))
  } else if (code == 601) {
    ElMessage({ message: msg, type: 'warning' })
    return Promise.reject(new Error(msg))
  } else if (code != 200) {
    ElNotification.error({ title: msg })
    return Promise.reject('error')
  } else {
    return Promise.resolve(res.data)
  }
},
  error => {
    console.log('err' + error)
    let { message } = error;
    if (message == "Network Error") {
      message = "后端接口连接异常";
    } else if (message.includes("timeout")) {
      message = "系统接口请求超时";
    } else if (message.includes("Request failed with status code")) {
      message = "系统接口" + message.substr(message.length - 3) + "异常";
    }
    ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
    return Promise.reject(error)
  }
)

export default service
bash 复制代码
调用

<script setup>
import { getList } from '@/api/requestApi'

const getListFn = () => {
  getList().then(res => {
    console.log(res)
  })
}
</script>

<template>
   <div class="index">
    index
    <button @click="getListFn">getList</button>
   </div>
</template>

<style lang="scss" scoped>

</style>

效果


只有最后一个 能正常请求

相关推荐
小黑技术栈13 分钟前
关于前端的一些话
前端
无人生还33 分钟前
从 Vue3 到 React · 快速上手系列第 11 篇:状态管理
前端·vue.js·react.js
GuWenyue35 分钟前
90%前端写React TS都踩坑!一套父子组件+Hooks完整实战,彻底搞懂类型约束
前端·react.js
Hilaku1 小时前
当 AI 一天写完一周的代码,我们还剩什么优势?
前端·javascript·程序员
尘世中一位迷途小书童1 小时前
无人机航线里的云台角度怎么调?Cesium 做了个视锥 + 鹰眼联动
前端·javascript·数据可视化
思码梁田1 小时前
CSS display 属性:从元素类型转换到隐藏元素的实用指南
前端·css·display·inline·block·none·inline-block
Csvn1 小时前
⚡ Vite 依赖预构建(optimizeDeps)的 3 个经典坑:改了源码不生效、新增依赖 404、缓存怎么清都不行
前端
A24207349301 小时前
Vue3 + TypeScript:后端数据在表格内渲染后进行增删改的完整实现步骤
前端·javascript·typescript
他们叫我 悦儿遥遥雨1 小时前
.NET 8 Web开发入门(六):Blazor 全栈开发——告别 JavaScript 焦虑
前端·javascript·.net
用户2181697049301 小时前
Flutter(九)StatelessWidget StatefullWidget
前端