Vue路由切换和Axios接口取消重复请求详解
作者:南城大前端 发布时间:2024-04-30 10:28:17
标签:axios,重复,请求
前言
在日常前端开发中, 经常会遇到频繁发起的重复请求, 会给服务器及网络造成不必要的压力, 可通过取消重复请求解决
场景
订单数据条件筛选查询
表单提交按钮频繁点击
路由页面切换请求未取消
解决方案
在每个请求发起的时候存储当前存储的标记在一个数组或Map中, 针对每个请求的时候在请求拦截中查询是否重复, 如果已重复则取消历史中重复的请求, 再发起当前请求, 如果没有重复, 则添加存储标记并正常请求, 已请求完成的清除存储标记
axios中如何取消请求
可以使用
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.');
还可以通过传递一个 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();
项目中封装使用
基本变量定义
// 是否取消重复请求开关
const cancelDuplicated = true
// 存储每个请求中的map
const pendingXHRMap = new Map()
// 取消请求类型定义 便于后期对此类型不做异常处理
const REQUEST_TYPE = {
DUPLICATED_REQUEST: 'duplicatedRequest'
}
设置重复标记的函数
const duplicatedKeyFn = (config) => {
// 可在此设置用户自定义其他唯一标识 默认按请求方式 + 请求地址
return `${config.method}${config.url}`
}
添加到请求记录
const addPendingXHR = (config) => {
if (!cancelDuplicated) {
return
}
const duplicatedKey = JSON.stringify({
duplicatedKey: duplicatedKeyFn(config),
type: REQUEST_TYPE.DUPLICATED_REQUEST
})
config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
if (duplicatedKey && !pendingXHRMap.has(duplicatedKey)) {
pendingXHRMap.set(duplicatedKey, cancel)
}
})
}
删除请求记录
const removePendingXHR = (config) => {
if (!cancelDuplicated) {
return
}
const duplicatedKey = JSON.stringify({
duplicatedKey: duplicatedKeyFn(config),
type: REQUEST_TYPE.DUPLICATED_REQUEST
})
if (duplicatedKey && pendingXHRMap.has(duplicatedKey)) {
const cancel = pendingXHRMap.get(duplicatedKey)
cancel(duplicatedKey)
pendingXHRMap.delete(duplicatedKey)
}
}
axios中使用
// 请求拦截处理
axios.interceptors.request.use(config => {
removePendingXHR(config)
addPendingXHR(config)
...
return config
})
// 响应拦截处理
axios.interceptors.response.use(response => {
removePendingXHR(response.config)
...
}, error => {
// 如果是取消请求类型则忽略异常处理
let isDuplicatedType;
try {
const errorType = (JSON.parse(error.message) || {}).type
isDuplicatedType = errorType === REQUEST_TYPE.DUPLICATED_REQUEST;
} catch (error) {
isDuplicatedType = false
}
if (!isDuplicatedType) {
// 其他异常处理
}
})
Vue中当路由切换页面的时候,将上一个页面的所有请求取消
router.beforeEach((to, from, next) => {
// 遍历pendingMap,将上一个页面的所有请求cancel掉
pendingXHRMap.forEach((cancel) => {
cancel();
});
pendingXHRMap.clear()
})
来源:https://segmentfault.com/a/1190000041774311
0
投稿
猜你喜欢
- 前言在测试过程中,注意力往往都在功能上,如果功能正常,是基本不会查看日志的,反之会查看日志定位问题。但是表面上的功能正常不能确保日志没有报错
- 如何用Python搞到小姐姐私房照本文纯技术角度出发,教你如何用Python爬虫获取百度图库海量照片——技术无罪。学会获取小姐姐私房照同理可
- 前言加密技术在数据安全存储,数据传输中发挥着重要作用,能够保护用户隐私数据安全,防止信息窃取。RSA是一种非对称加密技术,在软件、网页中已得
- 首先祝大家国庆节日快乐,这个假期因为我老婆要考注会,我也跟着天天去图书馆学了几天,学习的感觉还是非常不错的,这是一篇总结。这篇博客准备讲解一
- 本文实例主要实现的是使用urllib和BeautifulSoup爬取 * 的词条,具体如下。简洁代码:#引入开发包from urllib.
- User Centered Design 以用户为中心的设计,一说到这个很多人马上想到互联网和软件的设计,因为在IT、互联网行业提得最多。其
- 前言在开始本文之前,先来介绍一下相关内容,大家都知道一些防护SSRF漏洞的代码一般使用正则来判断访问IP是否为内部IP,比如下面这段网上比较
- 这个是很有用的一个运算,除了本身可以求自然对数,还是求指数函数需要用到的基础函数。实现原理就是泰勒展开,最简单是在x=1处进行泰勒展开:但该
- 本文实例讲述了js控制多图左右滚动切换效果。分享给大家供大家参考。具体如下:这是一款纯js实现点击左右按钮图片自动左右平滑滚动,默认5个一组
- 在国外一博客看到的技巧,终于解决IE的这个老大难问题。我在IE的setAttribute bug也提到其解决方法,一是innerHTML,一
- 本文实例为大家分享了python实现复制大量文件的具体代码,供大家参考,具体内容如下本来是去项目公司拷数据,结果去了发现有500G,靠系统的
- Python有一个不错的3D引擎——UrsinaUrsina官网:www.ursinaengine.
- 起因写这篇博客的起因是今天在刷leetcode的每日一题,是一道字符串转换整数 (atoi)的题,感兴趣的话可以点击题目名称去看一下具体描述
- 一、多标签支持一般制作按钮除了使用<button>标签元素之外,还可以使用<input type="submit
- 目录1. threding模块创建线程对象2. threding模块创建多线程3. 多线程的参数传递4. 线程产生的资源竞争1. thred
- 我们在上传大文件时,可能会由于服务器的原因导致文件上传失败,文件过大时由于服务器的配置或响应事件过长导致上传文件失败,这时候我们可以将一个大
- 有的时候我们在学习或者工作中会使用到SQL语句,那么介绍一下limit和offset的使用方法。mysql limit与offset用法my
- 前言某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码。我拍腿正坐,一个想法油然而
- #!#backup.sh##系统名称sysname=gzsyspath=/home/oracle/databak/$sysname/v_da
- 我们知道为了提高代码的运行速度,我们需要对书写的python代码进行性能测试,而代码性能的高低的直接反馈是电脑运行代码所需要的时间。这里将介