如何处理节点中的结束信号.js 可写流



使用 node.js 0.10 的stream.Writable基类,我如何处理消费者调用.end()的情况,从而发出不再有可用的数据的信号?

在文档中,被告知在Writable子类中实现的唯一方法是_write,但是我找不到任何干净的方法来通知输入何时耗尽。

我找到的答案是听finish事件。

调用 end() 方法并且所有数据都已刷新到基础系统时,将发出此事件。

我还没有测试过它,但我阅读本文的方式是,所有对_write的调用都必须在发出finish事件之前完成。

我知道

这很老,但我在 2020 年遇到了这个问题。如果其他人在这里找到自己的方式:现在按照此处所述在Writable._final()中实现

令人尴尬的是,从 0.10 开始,node 的stream.Writable并不以标准、干净的方式支持这一点。这里已经讨论了这个问题:https://github.com/joyent/node/issues/7348

在该页面中提出了几种解决方法。TomFrost的可冲洗可写模块目前看起来是一个可以接受的解决方案。

该模块提供了一个FlushWritable类,该类的使用方式与stream.Writable完全相同,但支持一种新的_flush方法,该方法在使用者调用.end()之后但在发出finish事件之前调用。

来自nodejs可写流的源代码。如果流能够结束,调用end将触发finish事件。如果流没有_final函数,则也会触发prefinish事件。

考虑你的问题

我如何处理消费者调用 .end() 的情况,从而发出不再有可用数据的信号?

您应该检查输入(可读流)何时结束,而不是输出(可写流)。因此,在这种情况下,您可以检查可读流上的end事件,例如:

readableStream.on('end', function () {
  // do what you want with your writable stream, maybe call the end() method
  writableStream.end();
});

如果您不想自己管理流,您甚至可以将可读流通过管道传输到可写流:

readableStream.pipe(writableStream);

相关内容

  • 没有找到相关文章

最新更新