流读取(0)指令

时间:2014-11-04 07:06:38

标签: node.js stream

我在这里找到的代码https://github.com/substack/stream-handbook从流中读取3个字节。我不明白它是如何运作的。

process.stdin.on('readable', function() {
    var buf = process.stdin.read(3);
    console.log(buf);
    process.stdin.read(0);
});

像这样被召唤:

(echo abc; sleep 1; echo def; sleep 1; echo ghi) | node consume.js

它返回:

<Buffer 61 62 63>
<Buffer 0a 64 65>
<Buffer 66 0a 67>
<Buffer 68 69 0a>

首先,为什么我需要这个.read(0)的东西?在我.read(size)请求之前,流是否有存储其余数据的缓冲区?但没有.read(0)它就会打印

<Buffer 61 62 63>
<Buffer 0a 64 65>
<Buffer 66 0a 67>

为什么?

第二个是这些sleep 1指令。如果我在没有它的情况下调用脚本

(echo abc; echo def; echo ghi) | node consume.js

它会打印

<Buffer 61 62 63>
<Buffer 0a 64 65>

无论我是否使用.read(0)。我完全不理解这一点。这里使用什么逻辑来打印这样的结果?

2 个答案:

答案 0 :(得分:2)

我不确定https://github.com/substack/stream-handbook的作者究竟使用read(0)方法尝试显示什么,但恕我直言这是正确的方法:

process.stdin.on('readable', function () {
  let buf;
  // Every time when the stream becomes readable (it can happen many times), 
  // read all available data from it's internal buffer in chunks of any necessary size.
  while (null !== (buf = process.stdin.read(3))) {
    console.dir(buf);
  }
});

您可以更改块大小,通过睡眠传递输入或不使用它...

答案 1 :(得分:2)

这些天我碰巧学习了NodeJS流模块。以下是Readable.prototype.read函数中的一些注释:

// if we're doing read(0) to trigger a readable event, but we
// already have a bunch of data in the buffer, then just trigger
// the 'readable' event and move on.

它说,如果.read(0)没有结束,则stream调用process.nextTick之后,只会触发(使用readable)另一个stream事件。

function emitReadable(stream) {
  // ...
  process.nextTick(emitReadable_, stream);
  // ...
}