认识 AbortController控制器对象 及其应用

news2024/10/7 10:17:47

参考文章1
参考文章2

一、什么是AbortController (abort 意为 中止/废弃)

AbortController是一个控制器对象(DOM API),可通过new构造函数的方式,生成控制器实例对象,根据需要终止/取消一个或多个Web请求/监听事件

通过new生成的控制器实例对象很简单,只有一个方法abort(),和一个对象属性signal(AbortSignal对象)signal属性上还有aborted、onabort、reason三个属性,主要用到aborted属性,表示是否已终止,其初始值为false

在这里插入图片描述

当控制器的实例方法abort()被调用时,实例对象的signal属性会触发abort事件,并将signal上的aborted属性变为true

触发abort事件可被监听,signal.addEventListener('abort',()=>{},{once:true}),且与同一个signal关联的监听器只会触发一次abort事件,故在添加abort事件监听器之前,需确保该监听器的abort事件未触发过,检查signal.aborted属性是否为初始值false

任何绑定到signal的事件监听器都应使用{once:true},以确保在处理abort事件后立即删除事件监听器,否则可能导致内存泄漏

二、AbortController控制器怎么用

// 1.创建监听器实例对象
let controller = new AbortController();
// 2.获取signal对象
let signal = controller.signal;
// 3.给signal对象绑定监听事件
signal.addEventListener('abort',() => alert('abort!'),{ once: true });
// 4.在需要中止的任何时刻中止
controller.abort();

三、AbortController和fetch配合使用

AbortController可用于中止fetch请求

let controller = new AbortController();
// 将`AbortController`的`signal`对象属性作为fetch的第二个参数options上的可选属性进行传递
fetch(url,{
	signal:controller.signal
})

// `fetch`方法会监听属性`signal`上的`abort`事件,在想要中止fetch时调用controller.abort()即可
controller.abort();

当fetch请求被中止时,它的promise就进入reject回调,并返回名为AbortError的DOMException,因此需使用try/catch进行容错处理

let controller = new AbortController();
// 1s后中止fetch请求
setTimeout(()=>{
  controller.abort()
}, 1000);
// 容错处理
try{
	let response = fetch(url,{
		signal:controller.signal
	})
}catch(err){
	if(err.name === 'AbortError'){
		alert('Aborted!')
	}else{
		throw err;
	}
}

注意:已经abort的fetch请求是不能重复调用的,调用已经被abort的fetch请求,当读到signal的状态是aborted时,会直接进reject回调

fetch源码:

 // fetch源码仓库地址: https://github.com/github/fetch/blob/master/fetch.js 
  if (request.signal && request.signal.aborted) {
    return reject(new DOMException('Aborted', 'AbortError'))
  }

AbortController允许一次取消多个 fetch请求

let urls = [...]; // 要并行 fetch 的 url 列表
let controller = new AbortController();
// 一个 fetch promise 的数组
let fetchJobs = urls.map(url => fetch(url, {
  signal: controller.signal
}));

let results = await Promise.all(fetchJobs);
// controller.abort() 被从任何地方调用,
// 它都将中止所有 fetch

如果我们有自己的与 fetch 不同的异步任务,我们可以使用单个 AbortController 中止这些任务以及 fetch。

在我们的任务中,我们只需要监听其 abort 事件:

let urls = [...];
let controller = new AbortController();
let ourJob = new Promise((resolve, reject) => { // 我们的任务
  ...
  controller.signal.addEventListener('abort', reject);
});

let fetchJobs = urls.map(url => fetch(url, { // fetches
  signal: controller.signal
}));

// 等待完成我们的任务和所有 fetch
let results = await Promise.all([...fetchJobs, ourJob]);

// controller.abort() 被从任何地方调用,
// 它都将中止所有 fetch 和 ourJob

四、AbortController和addEventListener配合使用

AbortController可作为addEventListener的第三个参数options上的可选属性
在这里插入图片描述
意思是,将controller的signal作为参数传进去,调用abort(),该监听器就会被移除

我们知道,取消监听器的方法removeEventListener(type,callback),这个callback必须和开启监听的callback是同一个函数引用,也就是说得把callback存下来,但有了signal就不用了

示例:实现按住鼠标后,监听鼠标的移动,松开鼠标后,取消监听

 const controller = new AbortController();
 function callback (e) {
   document.addEventListener('mousemove',  (e) => {
   },{
        signal: controller.signal  
   });
}
 document.addEventListener('mousedown', callback);
 document.addEventListener('mouseup', controller.abort);

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

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

相关文章

微信开发者工具突然打不开问题解决

今天微信小程序开发者工具 好好的在电脑里 突然就打不开了 这个问题已经上百度了 想必并不是很少遇到 可能是版本太旧 或者 其中依赖文件丢失 这个基本不用抱什么幻想 还是得重新装 先将快捷打开方式删掉 然后找到工具所在目录 把它删了 然后访问如下地址 https://mp.weixi…

日期时间选择器el-date-picker,限制可选范围,以后端接口某个时间字段为时间节点

哈喽 大家好啊 今天需要做一个时间选择器的限制,不然用户选择某个时间节点之前的时间 比如用户选择发货时间不允许早于收货时间(来自后端接口) picker-options当前时间日期选择器特有的选项参考下表object 首先申明一个时间可选对象 因为我…

黑马程序员-学成在线项目总结

黑马程序员-学成在线项目总结 收获 基础公共样式 清除默认样式,例如内边距、外边距、项目符号等等 设置通用样式,例如:文字样式 项目结构 注:多个css文件引入顺序,先清除,后设置 版心效果 许多网页整体都有版心居…

Java框架学习01(Spring框架)

1、什么是Spring框架? Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。 我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行…

网络漏洞管理

网络漏洞是硬件、软件或流程中的漏洞或缺陷,可能威胁到网络的正常运行。漏洞会使您的业务和客户的敏感数据面临风险,导致黑客轻松进入、销售额下降、声誉损失和处罚。网络漏洞可以分为硬件、固件、软件和人类漏洞。如果这些实体中的任何一个没有得到适当…

关于Kerberos认证的一些攻击手法学习总结

Kerberos认证流程 前言 本文主要分享最近学习的关于域内Kerberos认证的一些攻击手法,以自我的理解为主,从原理理解切入到基本工具利用来阐述,个人的理解分析较为啰嗦,嫌太兀长的可以跳着看就好,还请各位谅解。如有错误…

唐毅:带领和数集团,做好科技成果与创新需求的“摆渡人”

近年来,人类已经进入有史以来科技创新爆发最密集最迅猛的大时代。 作为人工智能、区块链、交互技术、游戏引擎及数字孪生技术、综合智能网络、物联网等若干前沿科技领域陆续高速发展又碰撞聚变后形成的元宇宙,成为最具引领性的力量。在人工智能、物联网…

网安笔记06 数字签名基本概念

数字签名基本概念 R1:receiver确认、证实sender的签名,这个签名不能被伪造S:sender发送出签名的教习给receiver,不能否认他签发的消息R2:receiver堆收到的签名消息不能否认,收报认证T:第三方可以确认手法收发双方之间的消息传输,…

Django框架之视图HttpRequest对象

本文主要是记录视图的HttpRequest对象属性、方法及示例。 概述 服务器接受http请求后,会根据报文创建httpRequest对象,包含所有请求中必须的数据; 视图方法的第一个参数就是HttpRequest对象;Django创建对象后,调用视…

本地提权漏洞分析【网络安全】

0. 前言 CVE-2023-21752 是 2023 年开年微软第一个有 exploit 的漏洞,原本以为有利用代码会很好分析,但是结果花费了很长时间,难点主要了两个:漏洞点定位和漏洞利用代码分析,欢迎指正。 1. 漏洞简介 根据官方信息&a…

chatgpt中文意思——预训练生成聊天模型

"ChatGPT"相关的英文表达 ChatGPT 这个名字由两部分组成:Chat 和 GPT。 Chat 是聊天,而GPT是Generative Pretrained Transformer的缩写:预训练生成模型。因此,ChatGPT的意思是预训练生成聊天模型。 简单来说就是一个预先…

第五十一章 Unity Input Manager 输入系统(下)

本章节我们就来使用水平轴和垂直轴来控制游戏物体的移动和旋转。我们之前大致讲过,游戏物体移动最重要的是方向,速度和时间三个要素,同样旋转也是。接下来,我们将之前创建的地形场景导入进来,如下所示 然后将之前的“M…

OpenAI又火一个新项目,已开源...

大家好,我是 Jack。 OpenAI 又有新动作了,开源发布 Shap-E。 今天,我继续手把手教学。 算法原理、环境搭建、效果测试,一条龙服务,尽在下文! 一、Shap-E 效果 Shap-E 算法的功能,简单来讲就…

第五十二章 Unity Input System 新输入系统

新输入系统InputSystem是2019年Unity新推出的插件。请注意,Unity默认使用旧的Input Manager,新的Input System处于未启用状态。当你安装Input System组件时,Unity会询问你是否启用新的输入系统。如果你选择Yes,Unity会启用新的并禁…

8通道高速同步采集板卡设计原理图与调试经验中文资料分享

采集卡实物图及功能框图如下 青翼型号-FMC128 FMC128功能框图 FMC148实物图 FMC148功能框图 FMC168实物图 FMC168功能框图 板卡对比如下图 青翼型号 通道数 采集分辨率 采样率 FMC1288通道16bit250MSPSFMC14814bit500MSPS/1GSPS/1.25GSPSFMC1682GSPS/2.6GSPS/3GSPS 技术指标FM…

Android 套壳本地html 生成apk

参考了:https://www.jianshu.com/p/ebf7948f3796 首页是前端会给到你html文件 目录基本上是这样的 image.png 步骤1: 创建assets目录 用户安卓studio 新合建工程就不写了 ,下面的图是如何创建assets资源目录: image.png image.png 步骤2:拷贝…

JVM-类加载机制

类的生命周期 ​ 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,**它在某些情况下可以在初始化阶段之后开始,这是为…

ext-5 void GPIO1Pin23PinMuxSetup(void)含义

在阅读starterware里控制led的代码,GPIO初始化有个这个函数 void GPIO1Pin23PinMuxSetup(void) {HWREG(SOC_CONTROL_REGS CONTROL_CONF_GPMC_A(7)) CONTROL_CONF_MUXMODE(7); } 如果不熟悉可能看的一头雾水,这个含义是: 解释一下&#xff…

【Nginx】Nginx面试题

什么是Nginx? Nginx是一个 轻量级/高性能的反向代理Web服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用ngin…

U-boot常用命令(二)

FAT格式文件系统操作命令 有时候需要在uboot中对SD卡或EMMC中存储的文件进行操作,这时候就要用到文件操作命令。跟文件操作相关的命令有:fatinfo、fatls、fstype、fatload 和 fatwrite,但是这些文件操作命令只支持 FAT 格式的文件系统&#…