发布时间:2023-03-18 11:30
在日常前端开发中, 经常会遇到频繁发起的重复请求, 会给服务器及网络造成不必要的压力, 可通过取消重复请求解决
在每个请求发起的时候存储当前存储的标记在一个数组或Map中, 针对每个请求的时候在请求拦截中查询是否重复, 如果已重复则取消历史中重复的请求, 再发起当前请求, 如果没有重复, 则添加存储标记并正常请求, 已请求完成的清除存储标记
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.\');
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() })
本文主要介绍了在日常前端开发中, 遇到各种情况下频繁发起的重复请求, 会给服务器及网络造成不必要的压力, 可通过取消重复请求解决。
到此这篇关于Vue路由切换和Axios接口取消重复请求的文章就介绍到这了,更多相关Vue Axios接口重复请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
axios官网取消请求
如何优雅的解决”重复请求“问题
从0开始的C语言入门教程day2(完结,让你0基础两天学会C语言)
mysql伪列的使用,mysql伪列的妙用,mysql获取近几天的日期用来连表查询
软件测试工程师涨薪攻略,1年多经验的测试从月薪8k-17k的转变
Spring Cloud Alibaba——Sentinel流量控制框架
linux snort centos搭建入侵检测系统snort及问题总结与解答
【用pandas_alive几行代码绘制竞赛动图】全网首发pandas_alive数据可视化中文学习笔记合集,学不会来打我(配置好的venv虚拟环境+拿来即用测试代码+测试数据集+参数api解析)
C语言程序设计(朱陈)-第10章 结构、联合、枚举 书籍学习
#今日论文推荐#文本生成图像新“天花板”?谷歌研究人员研发图像生成器Imagen,评分超OpenAI同类模型
买二手房的朋友注意了,民法典实施后,被抵押的房子也可以直接过户了 - 知乎