stream.addAbortSignal(signal, stream)
signal<AbortSignal> 表示可能取消的信号stream<Stream> | <ReadableStream> | <WritableStream> 一个用于附加信号的流。
将 AbortSignal 附加到可读或可写流。这允许代码使用 AbortController 控制流的销毁。
【Attaches an AbortSignal to a readable or writeable stream. This lets code
control stream destruction using an AbortController.】
对与传入的 AbortSignal 对应的 AbortController 调用 abort,其行为与在流上调用 .destroy(new AbortError()) 相同,对于 Web 流则是 controller.error(new AbortError())。
【Calling abort on the AbortController corresponding to the passed
AbortSignal will behave the same way as calling .destroy(new AbortError())
on the stream, and controller.error(new AbortError()) for webstreams.】
const fs = require('node:fs');
const controller = new AbortController();
const read = addAbortSignal(
controller.signal,
fs.createReadStream(('object.json')),
);
// Later, abort the operation closing the stream
controller.abort(); 或者将 AbortSignal 与可读流作为异步可迭代对象一起使用:
【Or using an AbortSignal with a readable stream as an async iterable:】
const controller = new AbortController();
setTimeout(() => controller.abort(), 10_000); // set a timeout
const stream = addAbortSignal(
controller.signal,
fs.createReadStream(('object.json')),
);
(async () => {
try {
for await (const chunk of stream) {
await process(chunk);
}
} catch (e) {
if (e.name === 'AbortError') {
// The operation was cancelled
} else {
throw e;
}
}
})(); 或者在可读流(ReadableStream)中使用 AbortSignal:
【Or using an AbortSignal with a ReadableStream:】
const controller = new AbortController();
const rs = new ReadableStream({
start(controller) {
controller.enqueue('hello');
controller.enqueue('world');
controller.close();
},
});
addAbortSignal(controller.signal, rs);
finished(rs, (err) => {
if (err) {
if (err.name === 'AbortError') {
// The operation was cancelled
}
}
});
const reader = rs.getReader();
reader.read().then(({ value, done }) => {
console.log(value); // hello
console.log(done); // false
controller.abort();
});