stream
{Stream} 可读和/或可写流。options
{Object}error
{boolean} 如果设置为false
,则对emit('error', err)
的调用不会被视为已完成。 默认值:true
。readable
{boolean} 当设置为false
时,即使流可能仍然可读,当流结束时也将会调用回调。默认值:true
。writable
{boolean} 当设置为false
时,即使流可能仍然可写,当流结束时也将会调用回调。默认值:true
。
callback
{Function} 带有可选错误参数的回调函数。- 返回: {Function} 清理函数,它会移除所有已注册的监听器。
当流不再可读、可写、或遇到错误、或过早关闭事件时,则该函数会获得通知。
const { finished } = require('stream');
const rs = fs.createReadStream('archive.tar');
finished(rs, (err) => {
if (err) {
console.error('流读取失败', err);
} else {
console.log('流已完成读取');
}
});
rs.resume(); // 排空流。
在错误处理场景中特别有用,该场景中的流会被过早地销毁(例如被终止的 HTTP 请求),并且不会触发 'end'
或 'finish'
事件。
finished
API 也可以 promise 化:
const finished = util.promisify(stream.finished);
const rs = fs.createReadStream('archive.tar');
async function run() {
await finished(rs);
console.log('流已完成读取');
}
run().catch(console.error);
rs.resume(); // 排空流。
在调用 callback
之后,stream.finished()
会留下悬挂的事件监听器(特别是 'error'
、'end'
、'finish'
和 'close'
)。
这样做的原因是,意外的 'error'
事件(由于错误的流实现)不会导致意外的崩溃。
如果这是不想要的行为,则需要在回调中调用返回的清理函数:
const cleanup = finished(rs, (err) => {
cleanup();
// ...
});