异步生成器中传递取消信号需手动集成abortsignal,在yield或await前检查signal.aborted并抛出aborterror,或传入可取消异步操作;消费端需配合for await...of监听信号或捕获错误,确保协作式及时终止。

在异步生成器(async function*)中传递取消信号,核心是让生成器能响应外部的 AbortSignal,并在每次 yield 前或等待操作中主动检查是否已中止。JavaScript 本身不自动将信号注入生成器,需手动集成。
监听 signal.aborted 并抛出 AbortError
最直接的方式是在生成器内部定期检查 signal.aborted,一旦为 true 就抛出符合规范的 AbortError(可复用原生构造函数):
- 在
yield前、await前、或循环迭代开始时检查 - 推荐使用
if (signal.aborted) throw new AbortError("Request canceled") - 注意:需确保
AbortError已存在(现代浏览器和 Node.js ≥18 默认提供;旧环境可自行定义)
将 signal 传入生成器并 await 可取消的 Promise
若生成器内部有异步 I/O(如 fetch),应将 signal 传给底层可取消操作,并用 await 等待它:
- 例如:
const res = await fetch(url, { signal }) - 这样当 signal 中止时,
fetch会自动 reject,错误会冒泡到生成器,中断执行 - 无需额外检查
aborted,但前提是所有异步步骤都真正支持 signal
在 for-await-of 中捕获取消并提前退出
消费端(调用方)也需配合:使用 for await...of 遍历时,应在循环内监听 signal,或在 catch 中处理 AbortError:
- 生成器内部抛出
AbortError后,迭代器的next()或throw()会拒绝,for await自动退出 - 也可在循环体中加
if (signal.aborted) break主动跳出(适合非 await 密集型逻辑) - 注意:不要忽略迭代器的
return()方法——手动调用它可触发生成器内部的finally块,用于清理资源
封装可取消的异步迭代器工厂
为复用性,可写一个高阶函数,接收原始生成器和 signal,返回带取消感知的迭代器:
- 内部创建子生成器实例,每次
next()前先检查signal.aborted - 若已中止,立即
return迭代结果{ done: true, value: undefined },并可选调用iterator.return() - 这样上层代码无需修改逻辑,只需替换迭代器创建方式
不复杂但容易忽略的是:取消不是“中断线程”,而是协作式通知。异步生成器必须主动检查、响应、清理,才能真正实现及时终止。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











