AbortController 与可读流的优雅取消机制
深入 AbortController 在 Web Streams API 中的应用,实现可读流、fetch 请求及异步迭代器的统一取消。 · 难度:入门 · +10XP
AbortController 与可读流的优雅取消机制
大多数教程仅展示 AbortController 用于取消 fetch,但在 Node.js 中,它能与 ReadableStream、TransformStream 协同工作。核心在于将 signal 传入流的构造函数,使外部能够通过 abort() 触发流内部的错误与清理。本教程演示如何创建一个可中断的异步生成器流,并利用 signal 的 abort 事件安全释放资源,避免内存泄漏。
const { Readable } = require('stream');
function createCancellableStream(signal) {
return new Readable({
read(size) {
if (signal.aborted) {
this.destroy(new Error('cancelled'));
return;
}
// 模拟数据推送
this.push(Buffer.from('data'));
},
destroy(err, callback) {
if (err) console.log('stream destroyed due to:', err.message);
callback();
}
});
}
const controller = new AbortController();
const stream = createCancellableStream(controller.signal);
setTimeout(() => controller.abort(), 100);