【前端】在 TypeScript 中使用 AbortController 取消异步请求
在 TypeScript 中使用 AbortController
来取消异步请求,尤其是像 fetch
这样的请求,可以提供一种优雅的方式来中止长时间运行的操作。下面是一个详细的步骤说明,展示如何在 TypeScript 中使用 AbortController
取消 fetch
请求。
步骤 1:创建 AbortController
实例
首先,你需要创建一个 AbortController
实例,并从中获取 signal
对象。这个 signal
对象将在请求中使用,以便在需要时取消请求。
const controller = new AbortController();
const signal = controller.signal;
步骤 2:发送带有 signal
的请求
当使用 fetch
发送请求时,传递 signal
作为选项的一部分。如果请求被取消,fetch
将会抛出一个带有 name
属性为 "AbortError"
的错误。
fetch('/api/data', { signal }).then(response => {if (!response.ok) {throw new Error(`HTTP error! Status: ${response.status}`);}return response.json();}).then(data => {console.log(data);}).catch(error => {if (error.name === 'AbortError') {console.log('Fetch operation was aborted');} else {console.error('Fetch operation failed:', error);}});
步骤 3:取消请求
在某个时刻,如果你决定要取消请求,只需调用 controller.abort()
方法即可。
setTimeout(() => {controller.abort();
}, 3000); // 取消请求将在3秒后发生
示例:完整的代码示例
下面是一个完整的示例,展示了如何使用 AbortController
来取消一个 fetch
请求:
// 示例:使用 AbortController 取消 fetch 请求
const controller = new AbortController();
const signal = controller.signal;// 在3秒后取消请求
setTimeout(() => {controller.abort();
}, 3000);// 发送带有 signal 的请求
fetch('/api/data', { signal }).then(response => {if (!response.ok) {throw new Error(`HTTP error! Status: ${response.status}`);}return response.json();}).then(data => {console.log('Received data:', data);}).catch(error => {if (error.name === 'AbortError') {console.log('Fetch operation was aborted');} else {console.error('Fetch operation failed:', error);}});
在使用 AbortController
取消请求后,如果需要重新尝试发送请求,可以采用几种不同的策略。下面将介绍如何在 TypeScript 中实现重新尝试的逻辑。
1. 手动重新尝试
最简单的方法是在请求被取消后手动重新触发请求。这种方法适用于你知道何时应该重新尝试的情况,比如在某些用户操作之后。
const controller = new AbortController();
const signal = controller.signal;// 发送带有 signal 的请求
fetch('/api/data', { signal }).then(response => {if (!response.ok) {throw new Error(`HTTP error! Status: ${response.status}`);}return response.json();}).then(data => {console.log('Received data:', data);}).catch(error => {if (error.name === 'AbortError') {console.log('Fetch operation was aborted');// 手动重新尝试setTimeout(() => {controller = new AbortController();signal = controller.signal;fetch('/api/data', { signal }).then(response => {if (!response.ok) {throw new Error(`HTTP error! Status: ${response.status}`);}return response.json();}).then(data => {console.log('Retried and received data:', data);}).catch(error => {console.error('Retry failed:', error);});}, 5000); // 5秒后重新尝试} else {console.error('Fetch operation failed:', error);}});
2. 使用重试库
另一种方法是使用重试库,例如 p-retry
或者 retry
,它们可以自动处理重试逻辑,并提供灵活的配置选项。
示例:使用 p-retry
首先安装 p-retry
:
npm install p-retry
然后在代码中使用它:
import retry from 'p-retry';async function fetchData(signal: AbortSignal): Promise<any> {return fetch('/api/data', { signal }).then(res => res.json());
}retry(() => fetchData(signal),{ retries: 3, factor: 2, minTimeout: 1000, maxTimeout: 3000 }
).then(data => {console.log('Received data:', data);}).catch(error => {console.error('Fetch operation failed:', error);});
3. 自定义重试逻辑
你也可以自己编写重试逻辑,根据需要调整重试次数、间隔时间等参数。
const MAX_RETRIES = 3;
const RETRY_INTERVAL = 1000; // 间隔时间(毫秒)async function fetchData(signal: AbortSignal): Promise<any> {return fetch('/api/data', { signal }).then(res => res.json());
}async function retryFetch(signal: AbortSignal, retriesLeft: number = MAX_RETRIES): Promise<any> {try {return await fetchData(signal);} catch (error) {if (error.name === 'AbortError' && retriesLeft > 0) {console.log(`Fetch operation was aborted, retrying... (${retriesLeft} attempts left)`);await new Promise(resolve => setTimeout(resolve, RETRY_INTERVAL));return retryFetch(signal, retriesLeft - 1);} else {throw error;}}
}retryFetch(signal).then(data => {console.log('Received data:', data);}).catch(error => {console.error('Fetch operation failed:', error);});
4. 使用 AbortController
的组合策略
你还可以结合使用 AbortController
和重试逻辑,以实现更复杂的场景。例如,在某些条件下取消请求,并在满足一定条件时重新尝试。
const controller = new AbortController();
const signal = controller.signal;// 在满足某些条件下取消请求
setTimeout(() => {if (/* 某些条件 */) {controller.abort();}
}, 3000);// 发送带有 signal 的请求
fetch('/api/data', { signal }).then(response => {if (!response.ok) {throw new Error(`HTTP error! Status: ${response.status}`);}return response.json();}).then(data => {console.log('Received data:', data);}).catch(error => {if (error.name === 'AbortError') {console.log('Fetch operation was aborted');// 根据条件重新尝试if (/* 满足重新尝试的条件 */) {const newController = new AbortController();const newSignal = newController.signal;fetch('/api/data', { signal: newSignal }).then(response => {if (!response.ok) {throw new Error(`HTTP error! Status: ${response.status}`);}return response.json();}).then(data => {console.log('Retried and received data:', data);}).catch(error => {console.error('Retry failed:', error);});}} else {console.error('Fetch operation failed:', error);}});
注意事项
- 兼容性:请确保你的浏览器或 Node.js 版本支持
AbortController
。对于不支持的环境,你可能需要考虑使用 polyfills。 - 信号传播:如果你在请求中使用了中间件(例如代理服务器),请注意
AbortController
的信号可能不会被正确传播。在这种情况下,你可能需要手动处理信号的传播。 - 资源释放:取消请求后,确保适当释放资源。例如,如果请求涉及文件上传,取消请求后应确保删除临时文件。
使用 AbortController 的好处
- 更好的用户体验:用户可以在长时间的请求未完成前取消请求,减少无响应的情况。
- 资源管理:可以避免因长时间未完成的请求而导致的资源浪费。
- 灵活性:为异步操作提供了一种灵活的控制机制。
通过这种方式,你可以有效地在 TypeScript 中使用 AbortController
来管理异步请求的生命周期。
相关文章:
【前端】在 TypeScript 中使用 AbortController 取消异步请求
在 TypeScript 中使用 AbortController 来取消异步请求,尤其是像 fetch 这样的请求,可以提供一种优雅的方式来中止长时间运行的操作。下面是一个详细的步骤说明,展示如何在 TypeScript 中使用 AbortController 取消 fetch 请求。 步骤 1&…...
k8s知识点总结
docker 名称空间 分类 Docker中的名称空间用于提供进程隔离,确保容器之间的资源相互独立。主要分类包括: PID Namespace:进程ID隔离,使每个容器有自己的进程树,容器内的进程不会干扰其他容器或主机上的进程。 NET Nam…...
论文阅读:三星-TinyClick
《Single-Turn Agent for Empowering GUI Automation》 赋能GUI自动化的单轮代理 摘要 我们介绍了一个用于图形用户界面(GUI)交互任务的单轮代理,使用了视觉语言模型Florence-2-Base。该代理的主要任务是识别与用户指令相对应的UI元素的屏幕…...
Windows on ARM上使用sherpa-onnx实现语音识别
Windows on ARM上使用sherpa-onnx实现语音识别 下载模型准备声音文件测试下载模型 模型所在的地址在这里(),通过git命令将模型下载下来 模型:hfd地址 git clone https://hf-mirror.com/csukuangfj/sherpa-onnx-streaming-paraformer-bilingual-zh-en将如下的代码保存成一个…...
Unity 打包AB Timeline 引用丢失,错误问题
1、裁剪 在 link.xml 添加 <assembly fullname"Unity.Timeline" preserve"all"/> 上面这一步我其实做了,但还是不行,各种搜索,不得解,还有创建一个空的Timeline 放到 Resources目录下的,也…...
【Kettle的安装与使用】使用Kettle实现mysql和hive的数据传输(使用Kettle将mysql数据导入hive、将hive数据导入mysql)
文章目录 一、安装1、解压2、修改字符集3、启动 二、实战1、将hive数据导入mysql2、将mysql数据导入到hive 一、安装 Kettle的安装包在文章结尾 1、解压 在windows中解压到一个非中文路径下 2、修改字符集 修改 spoon.bat 文件 "-Dfile.encodingUTF-8"3、启动…...
STM32的hal库在实现延时函数(例如:Delay_ms 等)为什么用滴答定时(Systick)而不是定时器定时中断,也不是RTC?
STM32的HAL库在实现延时函数(如Delay_ms等)时选择使用滴答定时器(Systick)而非定时器定时中断或RTC(实时时钟),主要基于以下几个原因: Systick定时器的优势 集成在NVIC中ÿ…...
刚刚买的域名被DNS劫持了怎么处理
在当今数字化的时代,域名作为网络世界的重要标识,对于个人和企业的在线业务都至关重要。然而,有时会遭遇令人头疼的问题,比如新买的域名被DNS劫持。这不仅会影响网站的正常访问,还可能导致用户信息泄露、业务受损等严重…...
递归 算法专题
递归题目技巧 什么是递归 函数自己调用自己的情况为什么会用到递归 本质: 主问题, 可以拆分成相同的子问题 子问题, 又可以拆分出相同的子问题如何理解递归? 宏观的看待递归的过程 1)不要在意递归的细节展开图 2)把递归的函数当成一个黑盒 3)相信这个黑盒一定能够完成这个任务…...
Logstash 迁移索引元数据(设置和映射)
https://help.aliyun.com/zh/es/use-cases/use-logstash-to-migrate-full-or-incremental-data-from-self-managed-elasticsearch-to-alibaba-cloud-elasticsearch 在进行数据迁移时,Logstash会帮助您自动创建索引,但是自动创建的索引可能与您待迁移的索…...
用python将pdf转成图片转换成对应的word文件
*科管系统**报告只能上传word,但是有些盖章文件只有pdf版本,因此有这个需求,目前市面上没这软件,只能自己python写一个。 要将PDF中的页面以图片的形式存储到Word文档中,你需要完成以下几个步骤: 从PDF中…...
list(c++)
list介绍 list是STL容器中的容器,且元素在容器中的位置是分散的并与大小无关。list的底层是双向链表,其优势是在任意位置插入和删除元素的时间复杂度为O(1),但无法通过“下标[ ]”直接访问元素,需要通过从头(尾&#…...
51单片机STC8G串口Uart配置
测试环境 单片机型号:STC8G1K08-38I-TSSOP20,其他型号请自行测试; IDE:KEIL C51; 寄存器配置及主要代码 STC8G系列单片机具有4个全双工异步串行通信接口;本文以串口1为例,串口1有4种工作方式…...
uni-app使用movable-area 实现数据的拖拽排序功能
文档地址 template部分 <movable-area :style"getAreaStyle"><movable-view class"table-row" v-for"v,i in move.list":key"v.id":y"v.y"change"handle_moving"direction"vertical"touchst…...
如何设置使PPT的画的图片导出变清晰
PPT画的流程图另存为图片 插入WORD不清晰的解决办法: 第一步:先调整PPT分辨率 根据此链接修改PPT默认的导出dpi 第二步:新建PPT准备 首先看想要保存的图的尺寸:点击图形-格式-长宽 新建一个ppt-设计-幻灯片大小-自定义大小 …...
和鲸科技 CEO 范向伟受邀揭牌启动南京大学 2024 级大学生人工智能素养大赛
2024 年 10 月 26 日,南京大学第十九届读书节在仙林校区图书馆举行开幕仪式。中国科学院院士、南京大学校长谈哲敏,校党委常委、副校长索文斌,原副校长、关工委主任闵铁军出席仪式,南京大学相关学院和职能部处负责人,以…...
NewStarCTF2024-Week4-Web-WP
目录 1、blindsql2 2、chocolate 3、隐藏的密码 4、ezcmsss 题目对勇师傅来说已经是开始上难度了所以这周没有AK 分享下自己做出来的题的解题思路 1、blindsql2 原本是在继续构造新的 payload,也测到了延时 打算去改上周的脚本,结果去跑的时候忘了将…...
Java学习Day56:暴打舔狗!(SpringBoot)
1.springboot简介 核心能力:Spring容器、日志、自动配置AutoCongfiguration、Starters web应用的能力:MVC、嵌入式Web服务器 数据访问(持久化):关系型数据库、非关系型数据库 强大的整合其他技术的能力 只要是Java中牛逼的技术,…...
RSA加密算法实现
Java实现RSA加密算法示例,包括密钥对的生成、加密和解密过程。首先需要导入Java的加密库,这些功能主要通过java.security和javax.crypto包提供。先生成了一个RSA密钥对,包括一个公钥和一个私钥。然后使用公钥加密了一个字符串,并使用私钥解密了加密后的字符串。加密和解密的…...
大数据新视界 -- 大数据大厂之优化大数据计算框架 Tez 的实践指南
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
java 中 List<T> 类型数据在 postgreSql 数据库中存储
一 属性添加注解 在类上面添加注解: TableName(autoResultMap true) 在字段上面添加注解: TableField(value "list", typeHandler UserHandler.class) private List<User> list new ArrayList<>(); 二 创建 UserHandler 类…...
公共命名空间,2024年10月的笔记
首先,我国选择C做为竞赛语言,许多人学C,学习的结果是:看到“公共命名空间”,就幻想出一个私有命名空间,其实,公共命名空间和C的命名空间无关! 超简源代码 已知序列v{1,2,3,4,5}&…...
frida脚本,自动化寻址JNI方法
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 1. 通过 ArtMethod 结构体找到 jni 方法在内存中的地址,并把寻址方法通过 rpc.exports 暴露给 Python 脚本调用 jni_addr.js let entry_point_fr…...
MySQL中between and的基本用法
文章目录 一、between and语法二、使用示例2.1、between and数值查询2.2、between and时间范围查询2.3、not between and示例 BETWEEN AND操作符可以用于数值、日期等类型的字段,包括边界值。 一、between and语法 MySQL中的BETWEEN AND操作符用于在两个值之间选择…...
Ceph 存储系统全解
1. 引言 什么是 Ceph? Ceph 是一个开源的分布式存储系统,旨在提供高性能、可扩展、无单点故障的统一存储平台。它可以同时支持对象存储、块存储和文件系统存储,能够满足不同存储需求的多种应用场景。Ceph 通过其强大的 RADOS(可…...
C# ftp帮助类 项目实战优化版
上位机开发中有时要与客户的文件服务器进行数据交互。如Mapping文件下载。结果文件上传等。我在项目中就常用到。现在把项目实战代码进行分享一下。 功能列表:连接服务器,下载文件,上传文件,删除服务器文件,获取当前目…...
栈和队列相关|有效的括号|用队列实现栈|用栈实现队列|设计循环队列(C)
20. 有效的括号 判断左右括号是否匹配,匹配返回true,不匹配返回false 通过栈来实现,类型和顺序,数量都要匹配 控制数量通过size 每个右括号都要找最近的左括号去判断类型匹配不匹配,顺序匹配不匹配 最后来判断数量匹配…...
云原生后端开发教程
云原生后端开发教程 引言 随着云计算的普及,云原生架构逐渐成为现代软件开发的主流。云原生不仅仅是将应用部署到云上,而是一种构建和运行应用的方式,充分利用云计算的弹性和灵活性。本文将深入探讨云原生后端开发的核心概念、工具和实践&a…...
TortoiseSVN小乌龟下载安装(Windows11)
目录 TortoiseSVN 1.14.7工具下载安装 TortoiseSVN 1.14.7 工具 系统:Windows 11 下载 官网:https://tortoisesvn.subversion.org.cn/downloads.html如图选 TortoiseSVN 1.14.7 - 64 位 下载完成 安装 打开 next,next Browse…...
Android adb命令获取设备id
Android adb命令获取设备id 方式很多,以下均可获得Android device id: adb shell settings get secure android_id adb shell settings get secure android_id adb devices -l adb shell content query --uri content://settings/secure --where "…...
企业站模板/网络搜索引擎
Redis 慢查询 许多存储系统提供慢查询日志帮助开发和运维人员定位系统的慢操作。慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值就将这条命令的相关信息记录下来Redis提供了相关的功能。 慢查询的两个配置参数 slowlog-log-slower-thanslo…...
贵阳培训网站建设/宣传推广方案范文
图片 Jietu20190404-1730282x.jpg介绍 Large jug with four grape-clusters symmetrically painted around the body grapes are a characteristic decorative motif in Theran pottery. 绘有四对象葡萄串的大水罐。 公元前16世纪 Akroteri on Thera 16th cent. BC. 年代&#…...
wordpress如何按更新排序/seo排名技术软件
前言:本系列总结了在前端面试中可能遇到的若干算法题,不定期更新最近看有同学面试遇到了n阶变态跳问题(n级台阶,每次最多允许跨n步,求多少种跨越方式),下面是一个变种问题 题目:假设…...
万维建设网站/小红书推广引流
一、函数使用方法Axure函数使用的基本语法是:用”[[ ]]”双方括号(即英文双中括号)包含,变量值和函数用英文句号(即点”. ”)连接。例如:[[LVAR. Width]] 表示变量LVAR的宽度[[This. Width]] 当前元件的宽度二、 函数分类根据Axure函数的应用…...
网站建设开源代码/关键词生成器
#所有的class文件不提交 *.class #所有的日志和锁文件不提交 *.log *.lock#所有的jar war ear 不提交 *.jar *.war *.ear #target目录下的所有东西不提交 target/#idea的配置文件不用提交 # .idea目录下不提交 .idea/ *.iml#STS .apt_generated .factorypath .springBeans# Int…...
邯郸做移动网站报价/优化快速排名教程
VIM 操作 vim 选中多行后批量缩进 ”shiftv“选中行使用””进行缩进 vim 全选功能 gg光标移动到首行 V进入可视模式(visual) G光标移动到最后一行 了解spf13 1.spf13-vim常用插件EasyMotion Vim:4th Level – Vim Superpowers 参考文献࿱…...