Javascript 可读流';s read方法不返回null
Javascript 可读流';s read方法不返回null,javascript,node.js,Javascript,Node.js,readableStream.read(size)的文档说 如果大小字节不可用,则它将返回null 为了测试这一点,我做了: // in test.js process.stdin.on('readable', function(){ var d = this.read(30); if (d) console.log(d.toString()); }); $ (echo abc; sleep 1; echo def; sleep 1; echo ghi) | node test.js
readableStream.read(size)
的文档说
如果大小字节不可用,则它将返回null
为了测试这一点,我做了:
// in test.js
process.stdin.on('readable', function(){
var d = this.read(30);
if (d) console.log(d.toString());
});
$ (echo abc; sleep 1; echo def; sleep 1; echo ghi) | node test.js
结果如下:
abc
def
ghi
我希望代码打印null
,因为大小(30)
大于写入的字节数。为什么不打印null
根据@hexa氰化物的评论,我将代码改写如下,然后再次运行测试:
process.stdin.on('readable', function() {
var d = this.read(300);
if (d === null) {
console.log("NULL")
} else {
console.log(d.toString());
}
});
process.stdin.on('end', function() {
console.log('END EVENT')
});
测试输出:
NULL
NULL
NULL
abc
def
ghi
END EVENT
我现在可以理解输出,直到3NULL的
之后,根据输出,我有几个问题:
abc\ndef\nghi
?我这样问是因为即使在将abcdefghi
推送到流之后,它的缓冲区长度仍然是9。因此,如果我在任何给定时间读取,读取操作应该返回null
。当然,我将读取大小设置为300在试图重现您的问题时,我假设您已经恢复了默认暂停的
进程.stdin
流。后来我发现,当我把这一点去掉时,我得到了你得到的意外输出。这是NodeJS文档中的说明:
默认情况下,stdin流暂停,因此必须调用
process.stdin.resume()
从中读取
在添加可读的监听器之前,我只是在流上使用了resume()
,并获得了预期的输出
我不知道我是否正确,但在您的情况下,我假设每次运行echo
时,readable
都会触发,并且read()
在这些情况下什么也不读,但是当stdin
关闭时,read()
只读取所有内容。以下是我的测试代码和结果:
process.stdin.on('readable', function() {
console.log('fire');
console.log(process.stdin.read(300));
}).on('end', function(){
console.log("END EVENT")
});
然后我像这样运行代码:(echo abc;sleep 1;echo def;sleep 1;echo ghi)| node test.js
,并得到以下结果:
fire
null
fire
null
fire
null
fire
<Buffer 61 62 63 0a 64 65 66 0a 67 68 69 0a>
END EVENT
火灾
无效的
火
无效的
火
无效的
火
结束事件
在恢复
stdin
流后进行测试时,readable
触发四次,并且read(300)
正确返回null
您还有其他代码要显示吗?使用您的设置,我运行了一些测试,d
如预期的那样为null
。请注意,由于您的if
语句,您不应该期望打印null
。在NodeJSv0.10.16
上测试。您应该使用检查null
如果(d==null)
@六氰化物,我已经根据您的评论更新了问题。请看一看。vinayr,谢谢你的建议,我已经在更新的问题中加入了你的空检查码,非常感谢你花时间。我对你的回答有一点意见。AFAIK当您在流上调用resume或pause时,它将进入流动模式,使该流仅发出数据事件,而不是可读事件。问题是,在第三次“火灾”事件之前我都清楚了。在第三个“fire”事件之后,节点如何能够读取流,因为流尚未填充300字节。+1,作为解释。对不起,我无法将其标记为已回答。