如何处理node.js可写流中的结束信号?

时间:2014-12-04 01:24:22

标签: node.js stream

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

the documentation中,告诉要在Writable子类中实现的唯一方法是_write,但是当输入用完时我无法找到任何干净的方法。

4 个答案:

答案 0 :(得分:2)

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

  

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

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

答案 1 :(得分:1)

我知道这已经很老了,但是我在2020年遇到了这个问题。如果其他人在这里找到了办法:Writable._final()中已经实现了,here

答案 2 :(得分:0)

令人尴尬的是,从0.10开始,节点stream.Writable不支持标准,干净的方式。此问题已在此处讨论:https://github.com/joyent/node/issues/7348

在该页面中提出了几种解决方法。 TomFrost的flushwritable模块暂时看起来是一个可接受的解决方案。

该模块提供FlushWritable类,其使用方式与stream.Writable完全相同,但支持新的_flush方法,该方法在消费者调用.end()之后但在{{{{}}之前调用发出1}}事件。

答案 3 :(得分:-1)

考虑你的要求

  
    

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

  

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

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

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

readableStream.pipe(writableStream);