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_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)
);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

地信大四,实习重要吗?怎么找实习岗位?

“地信怎么找实习啊?” “实习三个月以上?暑假只有两个月啊” “什么岗位实习比较有用?” “助理类岗位是做什么?” …… 同学们好啊,不知不觉24年已经是过完一小半了,24届毕业的同学们也差不多就要迎来…

ES内存溢出报错问题解决方案

博主有话说&#xff1a;该博文根据实际案例编写&#xff0c;在编写过程中将敏感信息进行替换&#xff0c;可能存在矛盾的地方&#xff0c;望见谅 1 错误详情 [typecircuit_breaking_exception, reason[parent] Data too large, data for [<http_request>] would be [1256…

Qt项目天气预报(5) - 根据JSON刷新天气信息+城市匹配

刷新当天天气 我们使用如下api接入&#xff0c;当然需要自己去 易客云天气API免费天气API接口|天气预报接口|全球天气API接口|气象预警|空气质量 (tianqiapi.com)注册后生成自己的对应id才可以使用 //专业天气v61 http://v1.yiketianqi.com/api?unescape1&versionv61&…

力扣爆刷第153天之TOP100五连刷26-30(接雨水、环形链表、最长上升子序列)

力扣爆刷第153天之TOP100五连刷26-30&#xff08;接雨水、环形链表、最长上升子序列&#xff09; 文章目录 力扣爆刷第153天之TOP100五连刷26-30&#xff08;接雨水、环形链表、最长上升子序列&#xff09;一、300. 最长递增子序列二、415. 字符串相加三、143. 重排链表四、42.…

docker技术的说明

根据学习网站整理&#xff1a;Docker 10分钟快速入门_哔哩哔哩_bilibili 小白也能看懂的容器科普说明_哔哩哔哩_bilibili 1.虚拟机&#xff0c;需要模拟硬件系统、运行整个操作系统&#xff0c;但体积臃肿&#xff0c;内存占用较高&#xff0c;程序的性能也会受到影响。 2.…

哪里找好用的商城系统源码?

很多企业在挑选商城系统时&#xff0c;由于不懂源码&#xff0c;很难选择到高质量源码的商城系统&#xff0c;那么哪里找好用的商城系统源码?如何选择?接下来就跟着启山智软小编一起来看看吧&#xff0c;以下为选择源码时的四看&#xff1a; 1.一看源码公司行业动态 可以查…

git上传本地项目及更新项目

1、注册GitHub账号和下载git 2、在GitHub上新建一个仓库&#xff0c;点击号——>New repository&#xff0c;给仓库起一个名字&#xff0c;点击Create repository 3、进入要上传的项目中&#xff0c;右键点击git back here&#xff0c;命令行输入git init初始化&#xff0c…

13个行业数据分析指标体系如何建设100问

提供针对13个行业的数据分析指标体系的全面指南&#xff0c;涵盖各行业的关键指标和分析维度&#xff0c;帮助读者深入了解和构建有效的指标体系。以下是文章的主要内容&#xff1a; 电商行业数据指标体系&#xff1a;包括客户价值、商品、网站流量、整体运营、市场营销活动、市…

什么是响应式编程

我们知道&#xff0c;当系统面对大流量、高并发的访问请求时&#xff0c;就可能会出现一系列性能问题&#xff0c;导致服务丧失了即时的响应性。如何时刻确保系统具有应对请求压力的能力&#xff0c;是架构设计的核心问题之一。 经典的服务隔离、限流、降级以及熔断等机制能够在…

基于Istio服务网格的熔断限流实现

在微服务架构的宏大图景中&#xff0c;Istio服务网格如同一位精巧的交通指挥官&#xff0c;它不仅确保了服务间通信的顺畅无阻&#xff0c;还通过先进的熔断与限流机制&#xff0c;为系统的稳定性筑起了一道坚固的防线。接下来&#xff0c;让我们一窥Istio如何在不改动服务代码…

YTM32的flash存储器boot-swap功能详解

YTM32的flash存储器boot-swap功能详解 文章目录 YTM32的flash存储器boot-swap功能详解IntroductionPricinple & MachenisimApplication基本的boot swap用例不更新bootloader的情况更新bootloader的情况 Conclusion Introduction 客户在开发量产型的ECU软件时&#xff0c;大…

并发编程理论基础——管程(并发编程的万能钥匙)(七)

什么是管程 Java采用了管程技术&#xff0c;synchronized关键字及wait()、notify()、notifyAll()三个方法都是管程的组成部分管程和信号量是等价的&#xff0c;管程和信号量之间可以互相实现英文名&#xff1a;Monitor 直译为监视器管程指的是管理共享变量以及对共享变量的操作…

项目性能优化之给dist文件夹中chunk-vendors.js做splitChunks分包,从而减少首屏加载时间

问题描述 我们项目做完,验收通过以后,就需要打包发布上线啦。于是我们执行命令:npm run build打dist包,打包完以后截图如下: 直接打包的chunk-vendors.js太大了 chunk-vendors.js文件太大了,所以我们需要将其优化一下,拆分一下 chunk-vendors.js是啥 chunk-vendors.j…

一种自定义SPI通信协议

本文介绍一种自定义SPI通信协议。 项目开发过程中&#xff0c;有时候会涉及到主处理器或FPGA和MCU之间的SPI通信&#xff0c;涉及到通信就需要考虑通信协议&#xff0c;本文给出一种简单的通信协议。 1.协议格式 协议格式如下图。 其中&#xff0c;将40 bit划分为2大部分&am…

代码随想录训练营Day 69|并查集理论基础、卡码网107.寻找存在的路径

1.并查集理论基础 并查集理论基础 | 代码随想录 并查集可以解决什么问题呢&#xff1f; 主要就是集合问题&#xff0c;两个节点在不在一个集合&#xff0c;也可以将两个节点添加到一个集合中。 注意&#xff1a;求根是求箭头出发的数 路径压缩&#xff1a;求根的根。把根的根的…

【C语言】数据的存储

目录 Ⅰ、数据类型介绍 1.类型的基本归类&#xff1a; Ⅱ、整形在内存中的存储 1 .原码、反码、补码 2. 大小端介绍 3 练习&#xff1a; Ⅲ、浮点型在内存中的存储 1 .浮点数存储规则 本章重点 1. 数据类型详细介绍 2. 整形在内存中的存储&#xff1a;原码、反码、补码 3. …

测试卡无法仪表注册问题分析

1、问题描述 00101测试卡无法注册LTE网络&#xff0c;modemlog中发现终端未发起Attach请求&#xff0c;对比正常注册非正常注册的版本&#xff0c;发现正常的多出了ims apn。可以通过ATCGDCONT?来查询modem APN参数。 2、问题分析 目前Modem是一套&#xff0c;没有相关修改。因…

SpringBoot使用滑动窗口限流防止用户重复提交(自定义注解实现)

在你的项目中&#xff0c;有没有遇到用户重复提交的场景&#xff0c;即当用户因为网络延迟等情况把已经提交过一次的东西再次进行了提价&#xff0c;本篇文章将向各位介绍使用滑动窗口限流的方式来防止用户重复提交&#xff0c;并通过我们的自定义注解来进行封装功能。 首先&a…

vue3 element-plus 实现 table表格合并单元格 和 多级表头

多级表头 数据结构比较复杂的时候&#xff0c;可使用多级表头来展现数据的层次关系。 只需要将el-table-column 放置于el-table-column 中&#xff0c;你可以实现组头。 一般可以直接用官网提供的写法&#xff0c;但是有可能数据会比较多的时候&#xff0c;就需要我们稍微改造…

江门电子行业实施MES系统前后对比

在江门电子行业实施MES系统之前和之后的对比可以涉及以下几个方面&#xff1a; 生产效率提升&#xff1a;实施MES系统后&#xff0c;江门电子行业可以实现生产过程的实时监控和优化&#xff0c;减少生产中的浪费和停机时间&#xff0c;提高生产效率。 质量控制改善&#xff1a;…