可读流's的读取方法不返回null
Readable stream's read method does not return null
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
,因为size(30)
大于写入的字节数。为什么不打印null
?
根据@hexacyanide的评论,我将代码改写如下,并再次运行测试:
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
我现在可以理解输出,直到3 NULL's
在那之后,我有一些基于输出的问题:
- 为什么我第一次测试的输出是
abc'ndef'nghi
?我之所以这么问,是因为即使将abcdefghi
推送到流中,它的缓冲区长度仍然是9。因此,如果我在任何给定时间进行读取,那么读取操作应该返回null
。可以肯定的是,我将读取大小设置为300 - 流如何知道我已经完成了所有的推送
当试图重现您的问题时,我认为您已经恢复了默认情况下暂停的process.stdin
流。后来我发现,当省略这一点时,我得到了你意想不到的输出。这就是NodeJS文档所说的:
stdin流默认情况下是暂停的,因此必须调用
process.stdin.resume()
从中读取。
在添加readable
侦听器之前,我只是在流上使用了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
。
相关文章:
- 获取“;无法读取属性'[方法]'“未定义”;
- 这是使用node.js和jade打开文件并读取每一行的方法吗
- 一种读取或更改CSS动画关键帧的方法
- 什么'是使用Gulp读取、重建和替换文件中内容块的最有效方法
- 用Javascript或其他方法通过语音读取整个HTML页面(离线)
- Ajax serialize() 方法没有读取 html 表单的所有数据字段
- 在对象中调用对象方法 - 错误:无法读取未定义的属性
- 读取视频中的视频元素/属性的正确方法是什么.js
- PHP - 从 PDF 读取用户选择的文本的解决方法
- 类型错误:无法读取 nodejs 应用程序中未定义的属性“方法”
- 读取 URL 中单个变量的最简单方法是什么
- $.get() 方法 JQuery 不读取任何内容 (html)
- 可读流's的读取方法不返回null
- AngularJS-can't读取变量's在我的一个方法中更改了值,它返回旧的valud
- CSS3 Jquery Gradients-有什么方法可以读取设置的值吗
- 工厂方法没有't return-TypeError:无法读取属性'那么'的未定义
- 未调用Angularjs服务方法,TypeError:无法读取属性'
- 从方法读取AngularJS中的$Cookies
- 如何使用javascript从soap中读取方法名称
- 如何从jQuery $.get方法读取返回的对象