当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Node.js stream.finished(stream[, options], callback)用法及代码示例


stream.finished(stream[, options], callback)

历史
版本变化
v15.11.0

添加了signal 选项。

v14.0.0

finished(stream, cb) 将在调用回调之前等待 'close' 事件。该实现尝试检测遗留流,并且仅将此行为应用于预计会发出 'close' 的流。

v14.0.0

Readable 流上在'end' 之前发出'close' 将导致ERR_STREAM_PREMATURE_CLOSE 错误。

v14.0.0

将在调用 finished(stream, cb) 之前已经完成的流上调用回调。

v10.0.0

添加于:v10.0.0


参数
  • stream <Stream> 可读和/或可写流。
  • options <Object>
    • error <boolean> 如果设置为 false ,则对 emit('error', err) 的调用不会被视为已完成。 默认: true
    • readable <boolean> 当设置为 false 时,将在流结束时调用回调,即使流可能仍然可读。 默认: true
    • writable <boolean> 当设置为 false 时,将在流结束时调用回调,即使流可能仍然是可写的。 默认: true
    • signal <AbortSignal>允许中止等待流完成。底层流将不是如果信号被中止,则被中止。回调将被调用AbortError.此函数添加的所有已注册侦听器也将被删除。
  • callback <Function> 采用可选错误参数的回调函数。
  • 返回: <Function> 清除所有已注册侦听器的清理函数。

当流不再可读、可写或遇到错误或过早关闭事件时获取通知的函数。

const { finished } = require('node:stream');

const rs = fs.createReadStream('archive.tar');

finished(rs, (err) => {
  if (err) {
    console.error('Stream failed.', err);
  } else {
    console.log('Stream is done reading.');
  }
});

rs.resume(); // Drain the stream.

在流被过早销毁(如中止的 HTTP 请求)并且不会发出 'end''finish' 的错误处理场景中特别有用。

finished API 提供了 Promise 版本:

const { finished } = require('node:stream/promises');

const rs = fs.createReadStream('archive.tar');

async function run() {
  await finished(rs);
  console.log('Stream is done reading.');
}

run().catch(console.error);
rs.resume(); // Drain the stream.

stream.finished() 在调用 callback 后留下悬空事件侦听器(特别是 'error''end''finish''close' )。这样做的原因是意外的 'error' 事件(由于不正确的流实现)不会导致意外的崩溃。如果这是不需要的行为,则需要在回调中调用返回的清理函数:

const cleanup = finished(rs, (err) => {
  cleanup();
  // ...
});

相关用法


注:本文由纯净天空筛选整理自nodejs.org大神的英文原创作品 stream.finished(stream[, options], callback)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。