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

news2024/11/16 7:47:52

为什么?

问题:为什么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_url
  timeout: 50e3, // request timeout
});

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

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

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

service.interceptors.response.use(res => {
  // 请求成功,从队列中移除
  const { url, method, isAbort = false } = response.config
  if (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.coloradmin.cn/o/1860908.html

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

相关文章

【JavaEE】浅谈线程(二)

线程 线程的常见属性 线程属性可以通过下面的表格查看。 •ID 是线程的唯⼀标识,不同线程不会重复 • 名称是各种调试⼯具⽤到(如jconsoloe) • 状态表示线程当前所处的⼀个情况,下⾯我们会进⼀步说明 • 优先级高的线程理论上来…

从公共仓库拉取推送的镜像并启动_将镜像内部目录挂载到外部目录使用_从镜像中复制文件到本机目录_从本机目录复制文件到镜像中---分布式云原生部署架构搭建010

然后我们再去找一个机器 docker ps docker rm -f 0ab docker images docker rmi guignginx 把这个机器的之前的这个镜像,在运行的 和 之前的都删除掉 然后我们去仓库中,拉取我们刚刚推送的 可以看到右边是命令 docker pull leifengyang/guignginx:v1.0 然后再来看总结命…

Unity踩坑记录

1. 如果同时在父物体和子物体上挂载BoxCollider&#xff0c;那么当使用&#xff1a; private void OnTriggerEnter2D(Collider2D collision){if (collision.CompareTag("CardGroup")){_intersectCardGroups.Add(collision.GetComponent<CardGroup>());}} 来判…

基于Java微信小程序民宿短租系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

精通pip:Python开发者的必备技能

目录 1. 安装 pip 2. 使用 pip 安装包 3. 卸载包 4. 更新包 5. 列出已安装的包 6. 搜索包 7. 使用 requirements.txt 文件安装多个包 8. 升级 pip 自身 9. 虚拟环境 10. 冻结依赖 11. 使用国内镜像源 12. 安装特定版本的包 13. 批量安装包 14. 显示帮助信息 15.…

常微分方程算法之编程示例三(预估-校正法)

目录 一、研究问题 二、C代码 三、计算结果 一、研究问题 本节我们采用预估校正法&#xff08;改进欧拉法&#xff09;求解算例。 预估-校正法的原理及推导请参考&#xff1a; 常微分方程算法之预估-校正法&#xff08;改进Euler法&#xff09;_、改进欧拉法-CSDN博客https…

东昂科技从创业板改道北交所:大客户依赖症明显,巨额分红又募投补流

《港湾商业观察》施子夫 黄懿 2024年6月24日&#xff0c;厦门东昂科技股份有限公司&#xff08;以下简称&#xff0c;东昂科技&#xff09;在北交所网站披露第二轮审核问询函的回复。自2024年1月IPO申请获北交所受理以来&#xff0c;东昂科技已经收到北交所下发的两轮审核问询…

探索SoMeLVLM:面向社交媒体处理的大型视觉语言模型

SoMeLVLM: A Large Vision Language Model for Social Media Processing 论文地址: https://arxiv.org/abs/2402.13022https://arxiv.org/abs/2402.13022发表在ACL 2024 1.概述 在线社交媒体平台涌现出海量的文本与视觉内容,深刻揭示了人们如何交流、互动以及自我表达。随着通…

动态规划数字三角形模型——AcWing 275. 传纸条

动态规划数字三角形模型 定义 动态规划数字三角形模型是在一个三角形的数阵中&#xff0c;通过一定规则找到从顶部到底部的最优路径或最优值。 运用情况 通常用于解决具有递推关系、需要在不同路径中做出选择以达到最优结果的问题。比如计算最短路径、最大和等。 计算其他…

研究上百个小时,高手总结了这份 DALL-E 3 人物连续性公式(下)

根据前两篇学习&#xff0c;如何创建人物连续性公式&#xff0c;或多或少都会联想到 Midjourney 里面的 Seed 值&#xff0c;是否能运用到 Dall e3 里面&#xff0c;那么今天这篇文章更新来了&#xff01;&#xff01; 继续感谢这位伟大的作者&#xff1a;AshutoshShrivastava…

五大基于Cesium的开源框架及其优劣势,一文导读。

2024-03-12 10:49贝格前端工场 OpenGL基础上有了webGL&#xff0c;webGL基础上有了Cesium&#xff0c;Cesium基础上有了N多开源框架&#xff0c;本文带大家看一下。 1. CesiumJS CesiumJS 是 Cesium 引擎的核心框架&#xff0c;提供了丰富的 API 和组件&#xff0c;用于构建…

基于Java微信小程序校园订餐系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

大模型训练十大戒律!!

1.切勿微调&#xff08;Thou Shalt Not Fine-Tune&#xff09;&#xff1a;尽量写prompt&#xff0c;利用大模型本身的能力zeroshot&#xff0c;必要时辅以少量样本&#xff08;few-shot examples&#xff09;或检索增强生成&#xff08;RAG&#xff09;。微调成本高、速度慢且…

如何在web页面下做自动化测试?

自动化测试是在软件开发中非常重要的一环&#xff0c;它可以提高测试效率并减少错误率。在web页面下进行自动化测试&#xff0c;可以帮助我们验证网页的功能和交互&#xff0c;并确保它们在不同浏览器和平台上的一致性。本文将从零开始&#xff0c;详细介绍如何在web页面下进行…

充电宝哪个牌子最好最耐用?耐用西圣、罗马仕、绿联充电宝实测

目前充电宝是我们出行必备的“能量伴侣”。然而&#xff0c;市面上充电宝品牌繁多&#xff0c;让人眼花缭乱&#xff0c;究竟哪个牌子最好最耐用呢&#xff1f;为了给大家找到答案&#xff0c;我们精心挑选了西圣、罗马仕和绿联这三个备受关注的品牌&#xff0c;并对它们的充电…

小米6款手机霸榜618 Top20,看安卓巨头如何撼动苹果地位

618购物节&#xff0c;作为中国电商领域的一大盛事&#xff0c;每年都会吸引无数消费者的眼球。在这场购物狂欢中&#xff0c;智能手机市场的竞争尤为激烈。 今年618&#xff0c;小米以6款手机上榜累计销量TOP20&#xff0c;超越了苹果的5款&#xff0c;成为上榜机型最多的品牌…

74. UE5 RPG 搭建场景设置光照和纹理流送

前面&#xff0c;我们对角色和敌人进行了一些完善。在这一篇文章里面&#xff0c;我们将进行对场景进行搭建&#xff0c;并对场景的光照和场景的后处理进行设置。 创建新场景 选择新建关卡 接着选择将关卡另存为 选择一个合理的位置 我们将场景内的网格地面删除掉&#xf…

如何提高测试管理的效率和一致性?

TestComplete 是一款自动化UI测试工具&#xff0c;这款工具目前在全球范围内被广泛应用于进行桌面、移动和Web应用的自动化测试。 TestComplete 集成了一种精心设计的自动化引擎&#xff0c;可以自动记录和回放用户的操作&#xff0c;方便用户进行UI&#xff08;用户界面&…

什么是 Linux 内核,其功能是什么?

inux内核是Linux操作系统的核心组件&#xff0c;负责管理系统的硬件资源&#xff0c;并为应用程序提供基本的操作系统服务。刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后…

服务器神秘挂起:一场惊心动魄的内核探案

2024年6月17日&#xff0c;我们的运维团队突然收到了一连串的告警。监控大屏上&#xff0c;代表着不同 Sealos 可用区的绿点中&#xff0c;零星地闪烁起了一两个红点。 “奇怪&#xff0c;怎么有几台服务器突然 hang 住了&#xff1f;” 值班的小辉皱起了眉头。 这次故障的诡…