使用 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);