我有这个代码在节点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();
但文档中说,暂停是建议性的,这让我很困惑。为什么我要暂停流,因为它在任何地方都没有连接?
0.10改进了Streams API,并添加了以下行为更改:
警告:如果从未添加
'data'
事件处理程序或调用resume()
,则它将永远处于暂停状态,并且永远不会发出'end'
。
因此,在0.10中,流将等待有效的侦听器,如pipe
或没有显式pause
的强制resume
。
另一方面,0.8及以上版本的Steams将立即开始发送'data'
,除非向pause
发出指示。在这种情况下,这会在超时和流之间创建一个竞争条件——流可能会在超时到期前部分运行,甚至完成。