如何在node.js Writable流中处理结束信号?

uyhoqukh  于 2023-05-06  发布在  Node.js
关注(0)|答案(5)|浏览(126)

使用node.js 0.10的stream.Writable基类,我如何处理消费者调用.end()并因此通知没有更多数据可用的情况?
在文档中,唯一被告知要在Writable子类中实现的方法是_write,但是我找不到任何干净的方法来注意输入何时耗尽。

9vw9lbht

9vw9lbht1#

我找到的答案是监听finish事件。
当调用end()方法并且所有数据都刷新到基础系统时,将发出此事件。
我还没有测试过它,但是我阅读这篇文章的方式是,所有对_write的调用都必须在finish事件发出之前完成。

whhtz7ly

whhtz7ly2#

我知道这是旧的,但我在2020年遇到了这个。如果其他人找到了他们的路:现在在Writable._final()中实现了这一点,如下所示

um6iljoc

um6iljoc3#

令人尴尬的是,在0.10版本中,node的stream.Writable并没有以标准、干净的方式支持这一点。这个问题已经在这里讨论过了:https://github.com/joyent/node/issues/7348
在该页面中,提出了几种解决方法。TomFrost的flushwritable模块目前看起来是一个可以接受的解决方案。
该模块提供了一个FlushWritable类,其使用方式与stream.Writable完全相同,但支持一个新的_flush方法,该方法在消费者调用.end()之后、finish事件发出之前调用。

vohkndzv

vohkndzv4#

从nodejs的可写流的源代码。调用end将触发finish事件,如果流能够结束。如果你的流没有_final函数,它也将是一个prefinish事件。

3phpmpom

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

相关问题