如何避免接口重复请求(axios推荐使用AbortController)

前言:

我们日常开发中,经常会遇到点击一个按钮或者进行搜索时,请求接口的需求。

如果我们不做优化,连续点击按钮或者进行搜索,接口会重复请求。

以axios为例,我们一般以以下几种方法为主:

1.使用防抖、节流函数限制请求操作(老传统,但是已经不是最佳实践了)

2.自定义节流阀(比如自定义一个字段loading,请求前值是true,请求后改为false。如果为值true,就终止往下请求,体验感很不友好,因为我们搜索的时候,会经常更换文字,所以上一个请求没结束,下个就没法请求。不推荐)

const getList = () => {if(loading.value) returnloading.value = trueaxios.get('/user/12345').then(res=> {loading.value = fasle})
}

3.使用axios请求库提供的api来解决重复请求的问题, AbortController或者CancelToken

Tips:有些请求库已经内置了这一功能,比如alova.js,有些之前同事的公司已经在运用,听说效果很不错,也很轻便,不需要配置便能过滤重复请求。但是目前我们大部分公司还是以axios为主的,所以我们下面主要分享下在axios里怎么完成这一功能。( 对alova感兴趣的伙伴,可以移步至官网了解下Alova.JS - 轻量级请求策略库 | Alova.JS)

AbortController

从v0.22.0开始,`Axios`支持`AbortController`以获取API的方式取消请求。具体如下:

const controller = new AbortController();axios.get('/foo/bar', {signal: controller.signal
}).then(function(response) {//...
});
// 取消请求
controller.abort()

示例:

<template><div><button @click="fetchData">请求</button></div>
</template><script setup>
import { ref } from 'vue';
import axios from 'axios';let controller = null;function fetchData() {if (controller) {controller.abort();controller = null;}controller = new AbortController();axios.get('https://api/user/12345',{signal: controller.signal})  //.then(response => {...})
}</script>

效果如下图:可以看到,重复的请求会直接被终止掉!

 axios.CancelToken 

deprecated

此 API 从 v0.22.0 开始已被弃用,不应在新项目中使用。

CancelToken官网示例

官网使用方法传送门:取消请求 | Axios中文文档 | Axios中文网

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.');

示例:

<template><div><button @click="fetchData">请求</button></div>
</template><script setup>
import { ref } from 'vue';
import axios from 'axios';let cancelTokenSource = null;function fetchData() {if (cancelTokenSource) {cancelTokenSource.cancel('Operation canceled by the user.');cancelTokenSource = null;}cancelTokenSource = axios.CancelToken.source();axios.get('http://api/uesr/12345',{cancelToken: cancelTokenSource.token})  //.then(response => {...})
}</script>

兼容

注意: 可以使用同一个 cancel token 或 signal 取消多个请求。

在过渡期间,您可以使用这两种取消 API,即使是针对同一个请求

const controller = new AbortController();const CancelToken = axios.CancelToken;
const source = CancelToken.source();axios.get('/user/12345', {cancelToken: source.token,signal: controller.signal
}).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.');
// 或
controller.abort(); // 不支持 message 参数

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

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

相关文章

「C系列」C 头文件及引发方法/操作

文章目录 一、C 头文件二、引用头文件的方法1. 使用尖括号 < > 引用标准库头文件2. 使用双引号 " " 引用用户自定义头文件 三、引用头文件的操作四、相关链接 一、C 头文件 在C语言中&#xff0c;头文件&#xff08;Header Files&#xff09;通常用于包含函数…

bashrc和profile区别

作用与目的&#xff1a; .bashrc&#xff1a;这个文件主要用于配置和自定义用户的终端环境和行为。每次启动新的终端时&#xff0c;.bashrc文件都会被执行&#xff0c;加载用户设置的环境变量、别名、函数等。这使得用户能够根据自己的喜好和需求来定制终端的行为和外观。profi…

如何通过编程获取桌面分辨率、操作像素点颜色、保存位图和JPG格式图片,以及图片数据的处理和存储方式

本节课在线学习视频&#xff08;网盘地址&#xff0c;保存后即可免费观看&#xff09;&#xff1a; ​​https://pan.quark.cn/s/c474d087e76f​​ 在图形编程中&#xff0c;获取桌面分辨率、操作像素点颜色、保存和处理图片数据是常见任务。本文将介绍如何通过编程实现这些操…

沃尔玛验厂报告的颜色分级

Walmart沃尔玛每年评估约 14000 份第三方社会责任验厂报告。沃尔玛验厂总的原则是&#xff0c;工厂从RBA、BSCI、SA8000等11个第三方社会责任验厂标准中&#xff0c;自由选择其中一个来进行验厂&#xff0c;验厂结束以后&#xff0c;把验厂报告提交给沃尔玛&#xff1b;然后沃尔…

【Pmac】PMAC QT联合开发中各种可能遇到的坑

目录 1. 错误 C2027 使用了未定义类型“PCOMMSERVERLib::DEVUPLOAD”2. 输入了正确的pmac的ip地址&#xff0c;没有显示可选的pmac设备3. Pmac DTC-28B无读数 使用QT编写PMAC上位机程序时&#xff0c;利用QT中的dump工具可以将pcommserver.exe转化为pcommserverlib.h和pcommser…

Java并发编程之线程基础

线程通知与等待 Java中的Object类是所有类的父类&#xff0c;鉴于继承机制&#xff0c;Java把所有类都需要的方法放到了Object类里面&#xff0c;其中就包括了线程的通知和等待。 wait以及notify 当一个线程调用一个共享变量的wait()方法时&#xff0c;该调用线程会被阻塞挂…

mysql数据库迁移步骤

备份数据库&#xff1a; mysqldump -u [username] -p[password] [database_name] > [database_name].sql 注意&#xff1a;“-u”与用户名之间有一个空格&#xff0c;而“-p”与密码之间没有空格 恢复数据库&#xff1a; mysql -u [username] -p[password] [database_name]…

调度算法-内存页面置换算法

缺⻚异常&#xff08;缺⻚中断&#xff09; 与⼀般中断的主要区别在于&#xff1a; 缺⻚中断在指令执⾏「期间」产⽣和处理中断信号&#xff0c;⽽⼀般中断在⼀条指令执⾏「完成」后检查和处理中断信号。缺⻚中断返回到该指令的开始重新执⾏「该指令」&#xff0c;⽽⼀般中断返…

【HarmonyOS】鸿蒙应用模块化实现

【HarmonyOS】鸿蒙应用模块化实现 一、Module的概念 Module是HarmonyOS应用的基本功能单元&#xff0c;包含了源代码、资源文件、第三方库及应用清单文件&#xff0c;每一个Module都可以独立进行编译和运行。一个HarmonyOS应用通常会包含一个或多个Module&#xff0c;因此&am…

简单处理字符串——6.14山大软院项目实训1

对于直接输出服务器返回的json到Debug&#xff0c;发现他还包含json的结构&#xff0c;但是不想调试json的返回结构&#xff0c;可以使用简单地处理字符串的方法&#xff0c;而不引入额外的库或复杂的JSON解析&#xff0c;但是这个解决方式是暂时的是投机取巧的&#xff0c;正确…

我主编的电子技术实验手册(08)——串联电阻分压

本专栏是笔者主编教材&#xff08;图0所示&#xff09;的电子版&#xff0c;依托简易的元器件和仪表安排了30多个实验&#xff0c;主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】&#xff0c;精心设计的【实验步骤】&#xff0c;全面丰富的【思考习…

单例及工厂模式适合的场景

工厂模式适合以下场景&#xff1a; 1. **对象的创建与使用分离**&#xff1a;工厂模式可以将对象的创建和使用分离&#xff0c;客户端只需要通过工厂来创建对象&#xff0c;而无需关心对象的具体实现细节。 2. **对象的类型不容易预先确定**&#xff1a;当需要根据条件动态创…

Golang——gRPC认证和拦截器

一. OpenSSL 1.1 介绍 OpenSSL是一个开放源代码的软件库包&#xff0c;用于支持网络通讯过程中的加密。这个库提供的功能包含了SSL和TLS协议的实现&#xff0c;并可用于生成密钥、证书、进行密码运算等。 其组成主要包括一下三个组件&#xff1a; openssl&#xff1a;多用途的命…

有效招聘营销策略的六个组成部分

任何想吸引更多人购买其产品的公司都必须投资于市场营销。然而&#xff0c;当涉及到让更多的人了解公司的工作时&#xff0c;许多有效的营销活动可能不是招聘团队的首要考虑因素。为了超越招聘委员会上的“发布祈祷”策略&#xff0c;有必要包括有效招聘营销策略的所有组成部分…

车联网车载设备

智能网联主要通过OBU&#xff08;On Board Unit,车载单元&#xff09;实现。OBU是一种安装在车辆上用于实现V2X通信的硬件设备&#xff0c;可实现和其他车辆OBU&#xff08;PC5&#xff09;、路侧RSU&#xff08;PC5&#xff09;、行人&#xff08;PC5&#xff09;和V2X平台&am…

基于Redis实现共享session登录

搭配食用&#xff1a;Redis&#xff08;基础篇&#xff09;-CSDN博客 项目实现前的 Mysql中的表&#xff1a; 表说明tb_user用户表tb_user_info用户详情表tb_shop商户信息表tb_shop_type商户类型表tb_blog用户日记表&#xff08;达人探店日记)tb_follow用户关注表tb_voucher优…

vlcplayer for android 源码编译log打印

vlcplayer for android 源码编译log打印 这篇文章记录了vlcplayer for android 开源库中libvlc.so中添加log打印的方法。 主要针对libvlc源码中msg_Info/msg_Err/msg_Warn/msg_Dbg 函数打印输出到Android log中。修改如下&#xff1a; vlc-android/libvlcjni/vlc/include/vlc…

c++编写自己的assert断言

文章目录 前言实现 前言 在 c c c中&#xff0c;assert只在debug模式下起作用&#xff0c;为了在release下也使用&#xff0c;我们可以实现自己的assert 实现 #include<iostream> #include<cstdlib>bool myAssert(bool expr, const char* file, const char* f…

if/case条件测试语句

一 条件测试 1.1返回码 $? $? 返回码 用来哦按段命令或者脚本是否执行成功 0 true为真就是成功成立 非0 false 失败或者异常 1.2 test 命令 可以进行条件测试 然后根据返回值来判断条件是否成立 -e &#xff1a;exist 测试目录或者目录是否存在 -d : director…

多目标跟踪 (MOT) 算法简介

据说即将开始的欧洲杯将会采用VAR来辅助裁判执法&#xff0c;这无疑将成为本届赛事的一大亮点。VAR&#xff0c;即视频助理裁判&#xff0c;是指在足球比赛中&#xff0c;裁判可以通过视频回放来辅助做出判罚。自2017年国际足联正式将VAR引入足球比赛以来&#xff0c;它已经在世…