【问题标题】:Must I repeatedly call readable.read() within a readable event handler?我必须在可读事件处理程序中重复调用 readable.read() 吗?
【发布时间】:2015-08-28 08:50:34
【问题描述】:

假设我创建了一个名为Parser 的转换流,它可以像普通流一样写入,但可以作为对象流读取。我正在为使用此转换流的代码使用readable 事件:

var parser = new Parser();
parser.on('readable', function () {
    var data = parser.read();
    console.log(data);
});

在这个事件处理程序中,我必须重复调用parser.read()吗?或者,readable 会为从我的转换流中推送的每个对象自行触发吗?

【问题讨论】:

    标签: node.js node.js-stream


    【解决方案1】:

    根据节点文档,"Once the internal buffer is drained, a readable event will fire again when more data is available," 因此,如果您只调用一次 read() 并且还有更多数据要读取,那么您必须稍后再记住 read()

    您可以在 while 循环中(在“可读”事件处理程序中)调用 read(),直到它返回 null,然后等待下一个“可读”事件。

    【讨论】:

    • 那么有必要在while循环中吗? readable.read() 的文档显示它处于一个 while 循环中。但它说 read() 将清空缓冲区。如果 readable 将再次被触发,是否有必要像文档显示的那样处于 while 循环中?
    • 点赞!为什么我不能只使用“数据”事件而不是在可读事件中运行 while 循环
    • @PirateApp 你可以。
    • 我也有同样的问题,因为文档还说“如果未指定大小参数,则将返回内部缓冲区中包含的所有数据。”,那么为什么@987654325 @ 循环是必要的
    【解决方案2】:

    如果您不指定大小,则每次触发事件时只需调用一次。每次有更多数据时,Readable 都会自行触发。

    然后您拥有readable.on('end', ...,它将让您知道何时没有更多可用数据。

    【讨论】:

    • 在这种情况下不能指定大小,因为它是一个对象流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多