节点异步流管道

时间:2013-07-12 19:07:16

标签: node.js asynchronous stream

我在Node 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说,暂停是建议性的,这让我很困惑。我为什么要暂停一个没有连接的流?

1 个答案:

答案 0 :(得分:4)

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

  

警告:如果您从未添加'data'事件处理程序或致电resume(),那么它将永远处于暂停状态并且永远不会发出{{1} }。

因此,在0.10中,流将等待有效的侦听器(如'end')或强制pipe而没有明确的resume

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