vue axios同时取消多个请求、 大数据展示平台离当前页面取消所有获取数据axios请求、cancelToken() 实现详解

项目场景:

批量取消未响应的axios请求


问题描述:

后端小李今天突然找我说后端服务挂了,我心想和我有啥关系,但是当他打开日志之后,我懵逼了,全是我前端调用后端接口的请求报错导致错误日志堆积磁盘爆满(话说内存不能给分大一点吗),说归说还是我写的bug还要我处理。


原因分析:

定时获取数据的定时器在token失效之后没有清除,这个bug改完之后,我立马又想到一个问题由于大数据监控平台数据量比较大后端接口响应时间较长,虽然我清了定时器但是那些还未响应请求接口咋办,于是我想到了axios的CancelToken(),取消当前的所有请求。


解决方案:

使用axios的CancelToken()批量处理,过程如下:

1.在全局封装axios的时候增加一个存储当前所有请求的数组

// 当前异步请求的合集
const _axiosPromiseArr = []

2.axios请求拦截器的config中增加cancelToken()

Axios.interceptors.request.use(config=>{
    config.cancelToken = new axios.CancelToken(cancel => {
      _axiosPromiseArr.push({cancel})
    })
    return config;
    },
    err => {
    return Promise.reject(err);
  }
)

3.当服务器报500的时候清除当前所有的请求,响应拦截器中增加

Axios.interceptors.response.use(
 response=>{
    if (response.data.code === 500) {
       // 清除当前所有的未得到结果的异步请求
      _axiosPromiseArr.forEach((element, index) => {
         element.cancel()
         delete _axiosPromiseArr[index]
      });
      localStorage.clear();
      return false;
      }
   } 
)

4.或者是当离开这一个页面、进入下一个页面的时候取消,这是后建议你将存放当前异步请求合集的数组挂在到window对象上这样就可以全局使用了。

在封装axios的时候将_axiosPromiseArr数组挂载到window对象上
window._axiosPromiseArr = []
路由守卫中增加当你离开这个页面的时候清除所有的请求
router.beforeEach((to, from, next)=>{
    window._axiosPromiseArr.forEach((element, index) => {
          element.cancel()
          delete window._axiosPromiseArr[index]
    });
})
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值