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

news/2024/7/10 14:20:04 标签: javascript, vue.js, es6

项目场景:

批量取消未响应的axios请求


问题描述:

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


原因分析:

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


解决方案:

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

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

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

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

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

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

javascript">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对象上
javascript">window._axiosPromiseArr = []
路由守卫中增加当你离开这个页面的时候清除所有的请求
javascript">router.beforeEach((to, from, next)=>{
    window._axiosPromiseArr.forEach((element, index) => {
          element.cancel()
          delete window._axiosPromiseArr[index]
    });
})

http://www.niftyadmin.cn/n/1319026.html

相关文章

Java截取指定字节长度的字符串

在实际的项目中,我们后台的数据库是根据指定编码(如GBK)保存数据的,为防止操作数据库时,因字段值长度超过数据库定义的长度,须在JAVA甚至JS层面做长度的校验控制,如数据库定义的长度是varchar2(…

浅谈ES6 对象新增方法 Object.is()、Object.assign()以及注意事项分析

文章目录前言一、Object.is()二、Object.assign()前言 大家好我是前端新手小猿同学,这篇文章主要给大家简单介绍一下ES6关于对象新增的Object.is()和Object.assign()方法的使用以及原理的简单分析,希望对大家的学习进步有所帮助,当然文章中可…

Oralce数据恢复

一.FLASHBACK QUERY--闪回到15分钟前 select * from table_name as of timestamp (systimestamp - interval 15 minute) where ...... 这里可以使用DAY、SECOND、MONTH替换minute,例如: SELECT * FROM table_name AS OF TIMESTAMP(SYSTIMESTAMP - INTERV…

Linux Daemon

分类 Linux Daemon 分为 Stand alone 和 Super daemon 两类 1. Stand alone 为独立守护进程,例如 httpd,vsftpd,他们是常驻内存的进程,优点是响应迅速,缺点是占用内存 2. Super daemon 是由一个超级进程负责管理的守护进程&#…

盘一盘那些你必须要掌握的JavaScript数组、字符串方法

文章目录前言一、数组必须掌握的10种常用方法?1.push()2.pop()3.unshift()4.shift()5.splice()6.slice()7.concat&#xf…

改变eclipse编码格式

1.改变整个工作空间的编码格式 改变整个工作空间的编码格式,这样以后新建的文件也是新设置的编码格式。 Eclipse->window->preferences->General->workspace->Other->UTF-8->OK 汉化版:eclipse->窗口->首选项->常规->工…

Qt实现图片移动

这学期实训的时候用MFC做过一个飞机大战,很无聊的东西,一直想用Qt做一个,但是在学校的时候比较颓,回来看了一下。 首先需要解决的问题是图片的移动,怎么说飞机啊子弹啊都是动着的,图片当然要跑起来。 闲话休…

结合实际工作场景深入理解Javascript深拷贝和浅拷贝的特性

项目场景: 大家在做后台管理系统的时候一定会有这种增、删、改这种需求,当然这种需求一般都是表格展示数据,最后一列是操作按钮,点击按钮会弹出操作框。如下图的这种模式: 问题描述: 但是小李最近在做的…