使用node.js 0.10的stream.Writable
基类,如何处理消费者调用.end()
的情况,从而发出信号,不再有可用的数据?
在the documentation中,告诉要在Writable
子类中实现的唯一方法是_write
,但是当输入用完时我无法找到任何干净的方法。
答案 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);