节点异步流管道



我有这个代码在节点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发出指示。在这种情况下,这会在超时和流之间创建一个竞争条件——流可能会在超时到期前部分运行,甚至完成。

相关内容

  • 没有找到相关文章

最新更新