【JavaScript】使用 AbortController 对象中断 fetch 的文本流传输

devtools/2024/10/19 9:42:33/

AbortController

正如我们所知道的,fetch 返回一个 promise。JavaScript 通常并没有“中止” promise 的概念。那么我们怎样才能取消一个正在执行的 fetch 呢?例如,如果用户在我们网站上的操作表明不再需要某个执行中的 fetch

为此有一个特殊的内建对象:AbortController。它不仅可以中止 fetch,还可以中止其他异步任务。

用法非常简单。

创建一个控制器(controller)

let controller = new AbortController();

控制器是一个极其简单的对象。

它具有单个方法 abort(),
和单个属性 signal,我们可以在这个属性上设置事件监听器。
当 abort() 被调用时:

controller.signal // 就会触发 abort 事件。
controller.signal.aborted // 属性变为 true。

通常,我们需要处理两部分:

一部分是通过在 controller.signal 上添加一个监听器,来执行可取消操作。
另一部分是触发取消:在需要的时候调用 controller.abort()。
这是完整的示例(目前还没有 fetch):

let controller = new AbortController();
let signal = controller.signal;// 执行可取消操作部分
// 获取 "signal" 对象,
// 并将监听器设置为在 controller.abort() 被调用时触发
signal.addEventListener('abort', () => alert("abort!"));// 另一部分,取消(在之后的任何时候):
controller.abort(); // 中止!// 事件触发,signal.aborted 变为 true
alert(signal.aborted); // true

正如我们所看到的,AbortController 只是在 abort() 被调用时传递 abort 事件的一种方式。

我们可以自己在代码中实现相同类型的事件监听,而不需要 AbortController 对象。

但是有价值的是,fetch 知道如何与 AbortController 对象一起工作。它们是集成在一起的。

fetch__46">与 fetch 一起使用

为了能够取消 fetch,请将 AbortController 的 signal 属性作为 fetch 的一个可选参数(option)进行传递:

let controller = new AbortController();
fetch(url, {signal: controller.signal
});

fetch 方法知道如何与 AbortController 一起工作。它会监听 signal 上的 abort 事件。

现在,想要中止 fetch,调用 controller.abort() 即可:

controller.abort();

我们完成啦:fetch 从 signal 获取了事件并中止了请求。

当一个 fetch 被中止,它的 promise 就会以一个 error AbortError reject,因此我们应该对其进行处理,例如在 try…catch 中。

这是完整的示例,其中 fetch 在 1 秒后中止:

// 1 秒后中止
let controller = new AbortController();
setTimeout(() => controller.abort(), 1000);try {let response = await fetch('/article/fetch-abort/demo/hang', {signal: controller.signal});
} catch(err) {if (err.name == 'AbortError') { // handle abort()alert("Aborted!");} else {throw err;}
}

参考

AbortController.AbortController()——MDN
Fetch:中止(Abort)


http://www.ppmy.cn/devtools/28324.html

相关文章

acwing算法提高之数学知识--筛质数、分解质因数和快速幂

目录 1 介绍2 训练 1 介绍 本博客用来记录筛质数、分解质因数和快速幂相关的题目。 2 训练 题目1&#xff1a;1292哥德巴赫猜想 C代码如下&#xff0c; #include <iostream> #include <cstring> #include <algorithm> #include <set>using namesp…

模型训练中的过拟合和欠拟合

基本概念 我们知道&#xff0c;所谓的神经网络其实就是一个复杂的非线性函数&#xff0c;网络越深&#xff0c;这个函数就越复杂&#xff0c;相应的表达能力也就越强&#xff0c;神经网络的训练则是一个拟合的过程。   当模型的复杂度小于真实数据的复杂度&#xff0c;模型表…

Dynamic-Programming

目录 前言 引入 1) Fibonacci 2) 最短路径 - Bellman-Ford 3) 不同路径-Leetcode 62 4) 0-1 背包问题 降维 5) 完全背包问题 降维 6) 零钱兑换问题-Leetcode322 降维 零钱兑换 II-Leetcode 518 7) 钢条切割问题 降维 类似题目 Leetcode-343 整数拆分 8) 最长…

018、Python+fastapi,第一个Python项目走向第18步:ubuntu24.04 安装cuda和pytorch环境

一、说明 我们安装了pytorch环境之后&#xff0c;会用yolo v9 来测试一下&#xff0c;看8g 显存能不能跑下来&#xff0c;上次用无影云电脑&#xff0c;4cpu8g内存直接爆了&#xff0c;云电脑也死机了&#xff0c;提示一直占用内存不释放&#xff0c;我自己的云电脑不能占用内…

C++:现代类型转换

C&#xff1a;现代类型转换 C/C的旧式类型转换C的现代类型转换静态类型转换 static_cast重新解释转换 reinterpret_cast常量类型转换 const_cast动态类型转换 dynamic_cast C/C的旧式类型转换 在C语言中&#xff0c;类型转换被分为显式和隐式&#xff0c;常见的类型转换如下&a…

web server apache tomcat11-26-maven jars

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

数据结构-二叉树的遍历

二叉树的遍历广义上是指下面我们说的七种遍历 深度优先搜索 : 递归完成 前序 中序 后序 的遍历 广度优先搜索 : 层序遍历(借助队列) 非递归的迭代法完成前中后遍历(借助栈) 代码合集如下 package TreeDemo; import java.util.*; public class BinaryTreeTest {public static c…

vue3中reactive和ref的比较

reactiveref❌ 只支持对象和数组&#xff08;引用数据类型&#xff09;✅ 支持基本数据类型 引用数据类型✅ 在 <script> 和 <template> 中无差别使用✅ 支持基本数据类型 引用数据类型❌ 重新分配一个新对象会丢失响应性✅ 重新分配一个新对象不会失去响应能直接…