axios取消某个请求和全局封装拦截器阻止重复请求

如果在短时间内连续发送同一个请求,可能会出现请求结果混乱(前一个响应结果覆盖后一个响应结果)的问题;这时候可以上一个请求还没响应就取消掉,这样可以解决求结果混乱的问题。

1.取消某一个请求,axios支持两种方式

(1)Axios 支持以 fetch API 方式—— AbortController 取消请求(从v0.22.0开始启用)

const controller = new AbortController();

axios.get('/foo/bar', {
   signal: controller.signal
}).then(function(response) {
   //...
});
// 取消请求
controller.abort()

(2)还有CancelToken可以取消请求(从v0.22.0之后弃用)

const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');

2. 二次封装全局取消重复请求(这种使用的是AbortController的方式)

import axios from 'axios'

// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  baseURL: '',
  // 超时
  timeout: 30000
})

//用map存储control对象
let requests = new Map()

// request拦截器
service.interceptors.request.use(config => {
  const oldControl = requests.get(`${config.url}-${config.method}`) 
  
  // 是否有重复请求,有则取消
  if (oldControl){
    oldControl.abort()
    requests.delete(`${config.url}-${config.method}`)
  }
  
  const control = new AbortController()
  config.signal = control.signal
  
  requests.set(`${config.url}-${config.method}`, control)
  
  return config
}, error => {
  Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(res => {
  // 如果响应成功就把Map中的对应control删除
  requests.delete(`${res.config.url}-${res.config.method}`)
  
  return res
})

export default service

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值