如何处理node.js中的结束信号可写stream?
使用node.js 0.10的stream.Writable
基类,如何处理消费者调用.end()
,从而发出信号,不再有数据可用?
在文档中唯一被告知在Writable
子类中实现的方法是_write
,但是我找不到任何干净的方式来注意input已经耗尽。
我find的答案是听finish
事件。
当
end()
方法被调用,并且所有的数据已经被刷新到底层系统时,这个事件就会被发出。
我还没有testing过,但是我正在阅读的方式,所有对_write
调用必须在finish
事件发出之前finish
。
令人尴尬的是,从0.10开始,节点的stream.Writable
不支持这个标准的,干净的方式。 这个问题已经在这里讨论: https : //github.com/joyent/node/issues/7348
在该页面中提出了几种解决方法。 TomFrost的可擦写模块暂时看起来是一个可接受的解决scheme。
该模块提供了一个FlushWritable
类,它的使用与stream.Writable
完全相同,但支持在消费者调用.end()
但在发送finish
事件之前调用的新的_flush
方法。
考虑你问什么
我怎么能处理一个消费者调用.end()的情况,从而发出信号,没有更多的数据可用?
,你应该检查你的input(一个可读的stream)何时结束,而不是你的输出(你的可写stream)。 因此,在这种情况下,您可以检查可读stream上的end
事件,如:
readableStream.on('end', function () { // do what you want with your writable stream, maybe call the end() method writableStream.end(); });
如果您不想自己pipe理stream程,您甚至可以将可读stream传送到可写入stream:
readableStream.pipe(writableStream);