axios全局封装AbortController取消重复请求

为什么?

问题:为什么axios要配置AbortController?防抖节流不行吗?

分析:

  • 防抖节流本质上是用延时器来操作请求的。
  • 防抖是判断延时器是否存在,如果存在,清除延时器,重新开启一个延时器,只执行最后一次请求。
  • 节流呢,是判断延时器是否存在,如果存在,直接return掉,直到执行完这个延时器。
  • 事实上,这些体验感都不算友好,因为对于用户来说,得等一些时间,尤其是首次请求,不是那么流畅。
  • 而当我们配置了AbortController,就可以中断掉重复的请求,并且首次不需要等待时间,是非常友好的行为。
  • 从axios0.22.0开始,开始支持AbortController,并且废弃CancelToken。之所以我们不用CancelToken来取消请求,是因为CancelToken存在内存泄漏隐患,并不安全,所以官方人员希望用户们升级版本,使用AbortController减少内存泄漏风险。
  • 事实上,凡事用xhr封装的请求库,都可以配置AbortController,如fetch,axios,alova等等
  • 本文封装的原理可以移步至另一篇博客查看:如何避免接口重复请求(axios推荐使用AbortController)-CSDN博客

前置条件:

升级axios至最新版本。因为AbortController是从0.22.0开始支持的。如果你的版本已经在0.22.0以上,可以正常使用,不升级亦可。

以笔者升级的项目为例,我这里的版本是很古老的0.18.0,所以我这里是直接把axios升级至目前最新的稳定版本1.7.2。(如果升级失败,可以先移除掉axios,再重新安装。)

//安装axios
npm i axios
//卸载axios
npm uninstall axios

接入步骤:

1.在封装axios的全局文件中,先定义两个变量

在全局封装axios的request.js文件的全局里定义两个变量
isCancel 用来判断请求是否被取消
cacheRequest 用来存储需要取消重复请求的接口
// isCancel-取消标识 可以根据这个值判断请求是否被取消
const { isCancel } = axios
const cacheRequest = {}

2.定义一个函数,用来取消请求和删除cacheRequest里对应的请求

// 删除缓存队列中的请求
function abortCacheRequest(reqKey) {if (cacheRequest[reqKey]) {// 通过AbortController实例上的abort来终止请求cacheRequest[reqKey].abort()delete cacheRequest[reqKey]}
}

3.在请求拦截器里加入取消重复请求的逻辑

之所以做成根据isAbort标识判断是否使用AbortController,是因为并不是所有的请求都是需要取消重复请求的,就像并不是所有的请求都需要防抖节流一样,所以当我们有需要的时候,再加这个标识就好。

const service = axios.create({baseURL: hosts.server, // api 的 base_urltimeout: 50e3, // request timeout
});service.interceptors.request.use(config => {// isAbort - 是config里配置的是否清除相同请求的标识,不传则默认是不需要清除const { url, method, isAbort= false } = configif (isAbort) {// 请求地址和请求方式组成唯一标识,将这个标识作为取消函数的key,保存到请求队列中const reqKey = `${url}&${method}`// 如果config传了需要清除重复请求的isAbort,则如果存在重复请求,删除之前的请求abortCacheRequest(reqKey)// 将请求加入请求队列,通过AbortController来进行手动取消const controller = new AbortController()config.signal = controller.signalcacheRequest[reqKey] = controller}
})

4.在响应拦截器里加入判断

如果请求成功后,清除cacheRequest里对应的存储;并且在error里判断,取消的请求不做任何处理

service.interceptors.response.use(res => {// 请求成功,从队列中移除const { url, method, isAbort = false } = response.configif (isAbort) delete cacheRequest[`${url}&${method}`]
}), error => {if (isCancel(error)) {// 通过AbortController取消的请求不做任何处理return Promise.reject({message: '重复请求,已取消'})}
}

5.使用

在调用接口的时候,增加一个isAbort的标识为true就能开启取消重复请求的功能了

//请求示例
export function getList(data) {return request({url: '/list',method: 'post',data: data,isAbort: true // 配置标识 如果该接口频繁请求 则会中断上次请求保留最新一次请求})
}

效果图:

体验感极佳,status为canceled,都是被取消的请求

小拓展: 

如何取消xhr的请求:

xhr.abort()

如何取消fetch请求:

let controller = new AbortController();
let signal = controller.signal;fetch(url, {signal});controller.abort(); // 取消请求//监听请求取消情况
signal.addEventListener('abort',() => console.log('abort!',signal.aborted)
);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10改远程桌面端口,Windows 10 修改远程桌面端口号的专业指南

在Windows 10系统中,远程桌面(Remote Desktop)功能允许用户从一台计算机远程访问和控制另一台计算机。为了增加远程连接的安全性,减少潜在的安全风险,修改默认的远程桌面端口号是一个常见的安全措施。以下是在Windows …

k8s学习--YAML资源清单文件托管服务nginx

文章目录 前言应用环境具体实现步骤1.安装源码nginx及相关模块2.修改nginx配置文件3.启动验证4.测试 总结 前言 nginx 是一个开源的高性能 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。在容器和 Kubernetes 的背景下,nginx 经常被用作静…

决策树算法原理

目录 一:介绍 二:算法原理 1.熵和信息熵 2.信息增益 三决策树分裂指标 1.信息熵分裂: 2.Gini系数(CART) 3.信息增益率 一:介绍 决策树( Decision Tree) 又称为判定树,是数据挖掘技术中的…

你如何看待市场波动性的?

实际上,波动性并不总是负面的,它有时也孕育着快速获利的机会。 对于长期投资者而言,市场波动(尤其与熊市相伴时)往往是一个优势。它允许投资者拓展并多样化投资组合,以较低的价格购入投资工具,…

【嵌入式Linux】<总览> 多进程(更新中)

文章目录 前言 一、进程的概念与结构 1. 相关概念 2. 内核区中的进程结构 3. 进程的状态 4. 获取进程ID函数 二、进程创建 1. fork和vfork函数 2. 额外注意点 3. 构建进程链 4.构建进程扇 三、进程终止 1. C程序的启动过程 2. 进程终止方式 四、特殊的进程 1. 僵…

免费体验软件开发生产线 CodeArts

软件开发生产线 CodeArts 一站式、全流程、安全可信的软件开发生产线,开箱即用,内置华为多年研发最佳实践,助力效能倍增和数字化转型 免费试用体验版套餐,50人内免费试用 功能特性 Scrum和看板需求模型 代码托管 代码检查&am…

GIS开发如何高质量就业?这几点是关键!

高质量就业,包含薪资和其他福利待遇,在讨论如何高质量就业之前,我们先来看下GIS开发岗位的前景、薪资水平如何?最后讨论一下GIS开发工程师到底需要学习哪些技术? 01 GIS开发岗位呈持续上升趋势 从GIS开发岗位趋势也可…

Java知识点整理 11— 后端 Spring Boot 万用初始化模板使用

一. 模块简介 annotation:自定义注解aop:请求日志和权限校验common:通用类config:配置类constant:常量 controller:控制层esdao:方便操作ESexception:异常类job:定时任务…

Facebook广告投放的6个误区,老手也会犯

一、没有目标 无论是投放哪种产品,我们始终都需要明确,广告的目标是什么。 因为Facebook广告的形式和类型,也经常会有变化,例如近期Facebook推出的360视频广告,以及之后即将推出的LIVE,Mid-Roll视频插播广…

美国电商选品、大促、趋势、案例,掌慧科技首期NewsBreak沙龙干货满满

今年第一季度,美国电商销售额达到了2681.2亿美元,相较上一年同期的2471.8亿美元增长8.5%。同时,该季度美国电商销售额在零售业总销售额中的占比为22.2%,高于上一年同期的21.2%。美国在2023年下半年通胀得到良好控制,20…

CleanMyMac2024破解版下载链接!你的Mac清洁利器!

嘿,亲爱的朋友们,今天我要跟大家分享一款我最近超级依赖的电脑清理神器—CleanMyMac2024破解版!如果你还在为电脑运行缓慢、存储空间不够而烦恼,那你一定不能错过它! 🔥 为什么选择CleanMyMac2024破解版&am…

声波的种类

声波可以根据不同的特性进行分类,主要包括频率和传播方式两个方面: ### 按频率分类: 1. **次声波**:频率低于20Hz的机械波,这类波通常不能被人耳感知。 2. **可闻声波**:频率在20Hz至20kHz之间的机械波&am…

C++ | Leetcode C++题解之第160题相交链表

题目: 题解: class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if (headA nullptr || headB nullptr) {return nullptr;}ListNode *pA headA, *pB headB;while (pA ! pB) {pA pA nullptr ? headB : p…

【fiddler】fiddler抓取websocket

1.先了解websocket流 下载4.5版本以上的fiddler 如图所示:在rules--customize rules 里面插入以下代码: static function OnWebSocketMessage(oMsg: WebSocketMessage) { // Log Message to the LOG tab FiddlerApplication.Log.LogString(oMsg.ToStr…

鸿蒙开发下拉选项框在表单递交的处理

下拉选项框 <select name"identity"><option value"0">顾 客</option><option value"1">行 政</option><option value"2" >保 洁</option></select>在表单数据中没有找到identit…

Win11 Docker Desktop下部署springboot jar

1.将springboot程序使用maven package打包出jar。 2.创建dockerfile&#xff0c;为了本地打包时方便&#xff0c;这里的dockerfile有小变动。 # Docker Desktop下部署springboot jar FROM openjdk:8 VOLUME /tmp EXPOSE 8601 ARG JAR_FILEtarget/webflux-hello-0.0.1-SNAPSHO…

AVL树插入详解

1.什么是AVL树 二叉搜索树可以提高搜索的效率&#xff0c;但是如果数据有序或者接近有序&#xff0c;就会退化为单边树&#xff0c;查找效率相当于在顺序表中查找数据&#xff0c;时间复杂度会退化到O(n)。AVL树解决了这个问题&#xff0c;通过保证每个节点的左右子树高度之差…

重学java 83.Java注解

As a failure,I met my last sound. —— 24.6.24 一、注解的介绍 1.引用数据类型: 类、数组、接口、枚举、注解 jdk1.5版本的新特性 一个引用数据类型 和类,接口,枚举是同一个层次的 引用数据类型:类、数组、接口、枚举、注解 2.作用: ① 说明&#xff1a;对代码进行说明,生…

elementui组件库实现电影选座面板demo

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Cinema Seat Selection</title><!-- 引入E…

前端中的深拷贝

第1部分&#xff1a;引言 深拷贝&#xff1a;前端开发的隐形守护者 在前端开发的世界里&#xff0c;数据的传递和状态的管理是构建用户界面的基础。然而&#xff0c;数据的复制常常被忽视&#xff0c;直到它引发bug&#xff0c;我们才意识到它的重要性。深拷贝&#xff0c;这…