📜  Node.js stream.finished() 方法(1)

📅  最后修改于: 2023-12-03 15:03:14.298000             🧑  作者: Mango

Node.js stream.finished() 方法

stream.finished() 方法是 Node.js stream 模块提供的一个 API,用于判断一个可读流或可写流是否已经结束。本文将详细介绍该方法的使用和注意事项。

方法签名
stream.finished(stream[, options], [callback])
  • stream: 可读流或可写流。
  • options: 一个可选的对象,可以指定 error 是否应该作为常规流事件触发,默认为 true。
  • callback: 一个回调函数,当流结束时将被调用。
返回值

返回 stream 对象,可以链式调用。

示例

判断可写流是否已经结束:

const fs = require('fs');
const { finished } = require('stream');

const writeStream = fs.createWriteStream('output.txt');
writeStream.write('write something\n');
writeStream.end(() => {
  console.log('write end');
  finished(writeStream, (err) => {
    if (err) {
      console.error('write stream failed', err);
    } else {
      console.log('write stream finished');
    }
  });
});

判断可读流是否已经结束:

const fs = require('fs');
const { finished } = require('stream');

const readStream = fs.createReadStream('input.txt');
let content = '';
readStream.on('data', chunk => {
  content += chunk;
});
readStream.on('end', () => {
  console.log('read end');
  finished(readStream, (err) => {
    if (err) {
      console.error('read stream failed', err);
    } else {
      console.log('read stream finished');
      console.log('content:', content);
    }
  });
});
注意事项
  • stream.finished() 方法只能在 Node.js v10.17.0 及以上的版本中才能使用。

  • 如果流已经结束,stream.finished() 方法立即调用回调函数。

  • 如果指定了 options,并且指定了 error: true,则流读取时发生的错误将被作为常规流事件触发。如果不希望错误在异常对象属性中捕获,可以使用 stream.destroy() 方法销毁流。

  • 如果流在调用回调函数之前销毁,将会在回调函数中触发错误事件。

  • stream.finished() 方法不能用于 Duplex 流和 Transform 流。