2013-07-12 158 views
4

我有这样的代码在节点0.10的工作,但不打印输出在0.8节点异步流管道

var http = require('http'); 
var req = http.request('http://www.google.com:80', function(res) { 
    setTimeout(function() { 
     res.pipe(process.stdout); 
    }, 0); 
}); 
req.end(); 

一些猜测,我发现解决方法后:

var http = require('http'); 
var req = http.request('http://www.google.com:80', function(res) { 
    res.pause(); 
    setTimeout(function() { 
     res.resume(); 
     res.pipe(process.stdout); 
    }, 0); 
}); 
req.end(); 

documentation说,该停顿咨询,这让我感到困惑。为什么我应该暂停流,哪里没有连接到任何地方?

回答

4

0.10 revamped the Streams API并添加行为进行以下更改:

警告:如果您从未添加'data'事件处理程序,或致电resume(),那么它会坐在处于暂停状态,永不发出'end'

所以,在0.10,流将等待有效的倾听者,就像一个pipe,或被迫resume没有明确pause

另一方面,0.8以上的蒸汽将立即开始发送'data',除非指示pause。而且,在这种情况下,会在超时和流之间创建争用条件 - 流可能会在超时到期之前部分运行甚至完成。

+0

我认为旧样式(0.10之前)的流不应该被称为流,但别的东西。我认为,对于那些对某种流API应该看起来像是来自其他语言的用户有一定期待的人们来说,这是非常混乱的根源。 –

+0

@UstamanSangat“* stream *”只是随时间传输的顺序数据;他们当然是那样的。值得赞扬的是完全不同的辩论问题。但是,期待一种语言的功能在另一种语言中完全匹配通常不是一个安全的选择。 –

+1

好......但显然他们投入并认识到在0.10 ;-) –