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

本文介绍了JavaScript中的AbortController如何帮助中止fetch请求,包括创建控制器、使用signal触发abort事件以及在fetch中传递signal以实现取消。fetch与AbortController的集成使得异步任务的取消更加方便。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
### 如何使用 AbortController 终止 Fetch 请求并传播到 Web Worker `AbortController` 是一种现代浏览器 API,允许开发者通过信号机制来取消异步操作。当 `fetch` 请求与 `AbortController` 结合时,可以优雅地中止网络请求[^1]。 以下是具体实现方式: #### 创建和控制中止信号 在主线程中创建一个 `AbortController` 实例,并将其 `signal` 属性传递给 `fetch` 函数作为选项的一部分。如果需要中断请求,则调用控制器的 `.abort()` 方法即可触发中止逻辑。 ```javascript // 主线程部分 const controller = new AbortController(); const signal = controller.signal; function fetchData(url) { return fetch(url, { signal }) .then(response => response.json()) .catch(error => { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { console.error('An error occurred:', error); } }); } // 调用函数发起请求 const url = 'https://example.com/data'; fetchData(url); // 随后可以通过调用 abort 来停止正在进行的操作 controller.abort(); // 这里会抛出一个名为 "AbortError" 的错误 ``` #### 将中止行为传播至 Web Worker 为了使该功能扩展到 Web Worker 上下文中,需将相同的信号发送过去并通过消息通信共享状态变化的通知。 ```javascript // 在主线程上启动 worker 并同步信号 if (window.Worker) { const myWorker = new Worker('./worker.js'); // 向 worker 发送初始化命令连同当前信号的状态标志 myWorker.postMessage({ action: 'init', signalState: !signal.aborted }); // 当本地决定要终止所有活动的时候也要告知 workers 停止工作 controller.addEventListener('abort', () => { myWorker.postMessage({ action: 'stop' }); }); // 接收来自 worker 的反馈信息 myWorker.onmessage = function(e) { console.log(`Message received from worker: ${e.data}`); }; } ``` #### 处理 Web Worker 内部的任务管理 Web Workers 应独立维护自己的运行周期,并响应主页面传来的指令调整其动作流程。 ```javascript // worker.js 文件内容 self.onmessage = function(event) { switch (event.data.action) { case 'init': self.isRunning = event.data.signalState; break; case 'stop': self.isRunning = false; // 设置内部标志位表明应该退出循环或者跳过后续处理阶段 console.warn('Stopping operations inside the worker.'); break; default: break; } while(self.isRunning){ performHeavyTask(); } }; function performHeavyTask(){ let result = complexCalculation(); postMessage(result); } ``` 上述代码展示了如何利用 `AbortController` 不仅能够安全地结束由 `fetch` 引发的数据获取过程,而且还能有效地通知关联的工作进程适时释放资源从而避免潜在的性能瓶颈或内存泄露风险[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值