stream.addAbortSignal(signal, stream)
-
signal
<AbortSignal> 代表可能取消的信号¥
signal
<AbortSignal> A signal representing possible cancellation -
stream
<Stream> | <ReadableStream> | <WritableStream> 附加信号的流。¥
stream
<Stream> | <ReadableStream> | <WritableStream> A stream to attach a signal to.
将 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())
和在网络流上调用 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;
}
}
})();
或者将 AbortSignal
与 ReadableStream 一起使用:
¥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();
});