axios AbortController 取消请求记录

import axios from 'axios'
// 创建axios实例
const http = axios.create({
  baseURL: ROOT // api的base_url
})
const { isCancel } = axios
const cacheWhiteList = []
const cacheRequest = []

/**
 * @desc 删除缓存队列中的请求
 * @param {String} reqKey 本次请求的唯一标识 url&method
 */
function removeCacheRequest (reqKey) {
  if (cacheRequest[reqKey]) {
    console.log(cacheRequest, reqKey)
    // 通过AbortController实例上的abort来进行请求的取消
    cacheRequest[reqKey].abort()
    delete cacheRequest[reqKey]
  }
}

// request请求拦截
http.interceptors.request.use(requestConfig => {
  const { url, method } = requestConfig
  const requestKey = `${url}-${method}`
  if (!cacheWhiteList.includes(requestKey)) {
    removeCacheRequest(requestKey)
    // 将请求加入请求队列, 通过AbortController 进行取消请求
    const controller = new AbortController()
    requestConfig.signal = controller.signal
    cacheRequest[requestKey] = controller
  }
  return requestConfig
})

// response 拦截
http.interceptors.response.use((response) => {
  const { url, method } = response.config
  const requestKey = `${url}-${method}`
  removeCacheRequest(requestKey)
  return response
}, error => {
  // 请求失败, 使用isCancel 判断是不是被取消的请求
  if (isCancel(error)) {
    return Promise.reject({
      msg: '重复请求, 自动拦截取消',
      message: '重复请求, 自动拦截取消'
    })
  }
  return err
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值