vue axios * 常用之重复请求取消
作者:小撕夜 发布时间:2023-07-02 17:03:21
标签:axios, , ,请求
引言
上一篇介绍了axios的简单封装,知道了axios * 的应用场景和方法,今天来看一下对于响应时间过长且请求次数过高的情况 * 如何处理。
取消请求的方法
Axios使用内部提供的CancelToken来取消请求
官网示例1:用CancelToken.source工厂方法创建 cancel token,像这样
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/user/12345', {
cancelToken: source.token
}).catch(function(thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {
// 处理错误
}
});
axios.post('/user/12345', {
name: 'new name'
}, {
cancelToken: source.token
})
// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');
官网示例2:通过传递一个 executor 函数到 CancelToken 的构造函数来创建 cancel token:
const CancelToken = axios.CancelToken;
let cancel;
axios.get('/user/12345', {
cancelToken: new CancelToken(function executor(c) {
// executor 函数接收一个 cancel 函数作为参数
cancel = c;
})
});
// cancel the request
cancel();
可以看到上面都是在单个请求中创建的 cancel token 实际工作中我们需要对所有的请求都进行处理,接下来我们看下如何在 * 实现取消请求的功能
* 中取消重复请求
import axios from 'axios'
import baseURL from './config'
import qs from 'qs'
const pendingRequest = new Map(); // 请求对象
const CancelToken = axios.CancelToken;
axios.defaults.timeout = 30000
axios.defaults.baseURL = baseURL.target
// 添加请求 *
axios.interceptors.request.use(function(config) {
// 在发送请求之前做些什么
config.headers = {
'content-type': 'application/json',
'token': getToken()
}
// 获取请求key
let requestKey = getReqKey(config);
// 判断是否是重复请求
if (pendingRequest.has(requestKey)) { // 是重复请求
removeReqKey(requestKey); // 取消
}else{
// 设置cancelToken
config.cancelToken = new CancelToken(function executor(cancel) {
pendingRequest.set(requestKey, cancel); // 设置
})
}
return config;
}, function (error) {
// 请求错误
return Promise.reject(error);
});
// 添加响应 *
axios.interceptors.response.use(function (response) {
// 请求对象中删除requestKey
let requestKey = getReqKey(response.config);
removeReqKey(requestKey);
// 对返回数据做点啥 比如状态进行拦截
if (response.data.status !== 200) {
Toast({
message: response.data.message,
type: 'warning',
duration: 1000
})
return
}
// 没问题 返回服务器数据
return response.data;
}, function (error) {
let requestKey = getReqKey(error.config);
removeReqKey(requestKey);
// 响应错误
return Promise.reject(error);
});
// 获取请求key
function getReqKey(config) {
// 请求方式、请求地址、请求参数生成的字符串来作为是否重复请求的依据
const { method, url, params, data } = config; // 解构出来这些参数
// GET ---> params POST ---> data
const requestKey = [ method, url, qs.stringify(params), qs.stringify(data)].join('&');
return requestKey;
}
// 取消重复请求
function removeReqKey(key) {
const cancelToken = pendingRequest.get(key);
cancelToken(key); // 取消之前发送的请求
pendingRequest.delete(key); // 请求对象中删除requestKey
}
来源:https://juejin.cn/post/7004721390767046686
0
投稿
猜你喜欢
- python 中sorted与sort有什么区别sort(cmp=None, key=None, reverse=False)sorted(
- 前言调用,让客户端可以更具自身情况自由选择,服务端工作只需要做一份呢?还别说真还有一个准备好的轮子那就是今天的主角《grpc-gateway
- 本文实例讲述了Python实现的十进制小数与二进制小数相互转换功能。分享给大家供大家参考,具体如下:十进制小数 ⇒ 二进制小数乘2取整对十进
- 本文是总结的一点经验之谈啥是data-key微信小程序推出 data- 属性——自定义属性,为了更好的进行数据传递。总结来说,data-ke
- 对于值传递和引用传递,书本上的解释比较繁琐,而php面试中总会出现,下面我会通过一个生活的例子带大家理解它们之间区别。第一步假设我们去酒店订
- 前言之前有人提了一个需求,我一看此需求用正则表达式最合适不过。考虑到之前每次使用正则表达式,都是临时抱佛脚,于是这次我就一边完成任务一边系统
- 描述安装python库有时会遇到安装失败的情况。这让我很难受,下面是一种解决办法供大家参考,我们可以换一种方法安装,比如从官网下载来安装。下
- 没有使用队列,也没有线程池还在学习只是多线程 #coding:utf8 import urllib2,sys,re import threa
- 单下划线单下划线用作变量最常见的一种使用场景是作为变量占位符,使用场景明显可以减少代码中多余变量的使用。为了方便理解,_可以看作被丢弃的变量
- asp分页,是学习使用asp编程经常遇到的问题,也算是一个经典的问题。本文介绍了一个asp分页源代码例子,希望对初学者有所帮助,本程序文件名
- 1.申明一个数组 var a[2] int 或者 a:=[2]int{1,2}2.数组索引数组就是索引的来建立如下图我们再来一个测试3.go
- 前言过去公司都是用的5.7 系列的MySQL,随着8.0的发版,也想试着升级一下。遇到了两个小错误,记录在此。在开始之前,如果对MySQL8
- php ffmpeg获取视频缩略图1.环境centos 7ffmpeg version 2.8.15 Copyright2.centos7安
- 用AJAX刷新一个DIV中的jsp内容 <script type="text/javascript"> va
- 本文介绍了webpack编译vue项目生成的代码探索,分享给大家,具体如下:前言往 main.js 里写入最简单的 vue 项目结构如下im
- 本文实例讲述了Python实现操纵控制windows注册表的方法。分享给大家供大家参考,具体如下:使用_winreg模块的话基本概念:KEY
- 有的时候我们会去扫表,然后拿出扫的结果再到另一张表里去查信息。比如下面一段index_sql_str = "select %s f
- 知识点:字符串在编程里,用的最多的就是字符串,字符串同时也是各类数据的中转站字符串运算符:编号运算符类型说明1+字符串拼接2*同一字符串多次
- 除了C/C++以外,我也接触过不少流行的语言,PHP、java、javascript、python,其中python可以说是操作起来最方便,
- select a.f_username from ( SELECT /*+parallel(gu,4)*/distinct gu.f_use