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

2024-06-24 12:04

本文主要是介绍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)
);

这篇关于axios全局封装AbortController取消重复请求的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090099

相关文章

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

springboot日期格式化全局LocalDateTime详解

《springboot日期格式化全局LocalDateTime详解》文章主要分析了SpringBoot中ObjectMapper对象的序列化和反序列化过程,并具体探讨了日期格式化问题,通过分析Spri... 目录分析ObjectMapper与jsonSerializer结论自定义日期格式(全局)扩展利用配置

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,