Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 可读流';s read方法不返回null_Javascript_Node.js - Fatal编程技术网

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
我现在可以理解输出,直到3
NULL的

之后,根据输出,我有几个问题:

  • 为什么第一次测试的输出是
    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
    。在NodeJS
    v0.10.16
    上测试。您应该使用
    检查
    null
    如果(d==null)
    @六氰化物,我已经根据您的评论更新了问题。请看一看。vinayr,谢谢你的建议,我已经在更新的问题中加入了你的空检查码,非常感谢你花时间。我对你的回答有一点意见。AFAIK当您在流上调用resume或pause时,它将进入流动模式,使该流仅发出数据事件,而不是可读事件。问题是,在第三次“火灾”事件之前我都清楚了。在第三个“fire”事件之后,节点如何能够读取流,因为流尚未填充300字节。+1,作为解释。对不起,我无法将其标记为已回答。