Node.js 节点流中的读取(0)做什么?

Node.js 节点流中的读取(0)做什么?,node.js,stream,Node.js,Stream,有谁能说明节点流中的read(0)是如何工作的,在哪种情况下是必需的 正式读取(0)文档为。它说: 在某些情况下,有必要触发底层可读流机制的刷新,而不实际消耗任何数据。在这种情况下,可以调用readable.read(0),它将始终返回null 我遇到了一个需要读取(0)的情况。这是我的。源代码是: process.stdin.on('readable', function () { var buf = process.stdin.read(3); console.dir(buf

有谁能说明节点流中的read(0)是如何工作的,在哪种情况下是必需的

正式读取(0)文档为。它说:

在某些情况下,有必要触发底层可读流机制的刷新,而不实际消耗任何数据。在这种情况下,可以调用readable.read(0),它将始终返回null

我遇到了一个需要读取(0)的情况。这是我的。源代码是:

process.stdin.on('readable', function () {
    var buf = process.stdin.read(3);
    console.dir(buf);
    process.stdin.read(0);
});
结果是:

$ (echo abc; sleep 1; echo def; sleep 1; echo ghi) | node consume2.js 
<Buffer 61 62 63>
<Buffer 0a 64 65>
<Buffer 66 0a 67>
<Buffer 68 69 0a>
结果将是:

$ (echo abc; sleep 1; echo def; sleep 1; echo ghi) | node consume1.js 
<Buffer 61 62 63>
<Buffer 0a 64 65>
<Buffer 66 0a 67>
$(echo abc;sleep 1;echo def;sleep 1;echo ghi)| node consumer1.js
我对上述代码进行了实验,发现如果我从subshell命令中删除了
sleep 1
,那么就不需要读取(0)语句

我认为在这里,子shell在发送ghi后会向consumer1.js发送一个“流结束”事件,但似乎consumer1.js不会收到“流结束”事件,除非read(0)做了一些事情。当read(0)执行某些操作时,js文件知道存在“流结束”,并且再次触发
readable

因此,我的问题是:

  • read(0)在这里做什么
  • 当从shell命令中删除
    sleep 1
    时,为什么读取(0)变得不必要
  • 任何一个都可以提供更多需要读取(0)的情况吗?(我尝试使用文件流而不是stdin作为js文件输入,然后不需要读取(0)

  • 谢谢。

    这可能会有帮助,谢谢。在我发布这个问题之前,我搜索了两个类似的帖子,其中一个是你建议的链接,但它们都有答案。
    $ (echo abc; sleep 1; echo def; sleep 1; echo ghi) | node consume1.js 
    <Buffer 61 62 63>
    <Buffer 0a 64 65>
    <Buffer 66 0a 67>