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();

但是文档说,暂停是建议性的,这让我感到困惑。为什么要暂停未连接到任何地方的流?

4

1 回答 1

4

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

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

因此,在 0.10 中,流将等待一个有效的侦听器,例如 apipe或一个resume没有显式pause.

另一方面,0.8 及更早版本的 Steam 将'data'立即开始发送,除非得到指示pause。而且,在这种情况下,这会在超时和流之间产生竞争条件——流可能会在超时到期之前部分运行甚至完成。

于 2013-07-12T19:39:12.447 回答