使用node.js 0.10的stream.Writable基类,我如何处理消费者调用.end()并因此通知没有更多数据可用的情况?在文档中,唯一被告知要在Writable子类中实现的方法是_write,但是我找不到任何干净的方法来注意输入何时耗尽。
stream.Writable
.end()
Writable
_write
9vw9lbht1#
我找到的答案是监听finish事件。当调用end()方法并且所有数据都刷新到基础系统时,将发出此事件。我还没有测试过它,但是我阅读这篇文章的方式是,所有对_write的调用都必须在finish事件发出之前完成。
finish
end()
whhtz7ly2#
我知道这是旧的,但我在2020年遇到了这个。如果其他人找到了他们的路:现在在Writable._final()中实现了这一点,如下所示
Writable._final()
um6iljoc3#
令人尴尬的是,在0.10版本中,node的stream.Writable并没有以标准、干净的方式支持这一点。这个问题已经在这里讨论过了:https://github.com/joyent/node/issues/7348在该页面中,提出了几种解决方法。TomFrost的flushwritable模块目前看起来是一个可以接受的解决方案。该模块提供了一个FlushWritable类,其使用方式与stream.Writable完全相同,但支持一个新的_flush方法,该方法在消费者调用.end()之后、finish事件发出之前调用。
FlushWritable
_flush
vohkndzv4#
从nodejs的可写流的源代码。调用end将触发finish事件,如果流能够结束。如果你的流没有_final函数,它也将是一个prefinish事件。
end
_final
prefinish
3phpmpom5#
考虑到你的要求如何处理消费者调用.end()并发出没有更多数据可用的信号的情况?,您应该检查输入(可读流)何时结束,而不是输出(可写流)。因此,在这种情况下,您可以在可读流上检查end事件,如:
readableStream.on('end', function () { // do what you want with your writable stream, maybe call the end() method writableStream.end(); });
如果你不想自己管理流,你甚至可以将可读流通过管道传输到可写流:
readableStream.pipe(writableStream);
5条答案
按热度按时间9vw9lbht1#
我找到的答案是监听
finish
事件。当调用
end()
方法并且所有数据都刷新到基础系统时,将发出此事件。我还没有测试过它,但是我阅读这篇文章的方式是,所有对
_write
的调用都必须在finish
事件发出之前完成。whhtz7ly2#
我知道这是旧的,但我在2020年遇到了这个。如果其他人找到了他们的路:现在在
Writable._final()
中实现了这一点,如下所示um6iljoc3#
令人尴尬的是,在0.10版本中,node的
stream.Writable
并没有以标准、干净的方式支持这一点。这个问题已经在这里讨论过了:https://github.com/joyent/node/issues/7348在该页面中,提出了几种解决方法。TomFrost的flushwritable模块目前看起来是一个可以接受的解决方案。
该模块提供了一个
FlushWritable
类,其使用方式与stream.Writable
完全相同,但支持一个新的_flush
方法,该方法在消费者调用.end()
之后、finish
事件发出之前调用。vohkndzv4#
从nodejs的可写流的源代码。调用
end
将触发finish
事件,如果流能够结束。如果你的流没有_final
函数,它也将是一个prefinish
事件。3phpmpom5#
考虑到你的要求
如何处理消费者调用.end()并发出没有更多数据可用的信号的情况?
,您应该检查输入(可读流)何时结束,而不是输出(可写流)。因此,在这种情况下,您可以在可读流上检查
end
事件,如:如果你不想自己管理流,你甚至可以将可读流通过管道传输到可写流: