我在这里找到的代码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)
。我完全不理解这一点。这里使用什么逻辑来打印这样的结果?
答案 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);
// ...
}