节点asynchronousstreampipe道
我有这个代码工作在节点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();
经过一番猜测,我find了解决办法:
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();
但文件说,停顿是咨询,这是让我困惑。 为什么我应该暂停stream,这是不是连接在任何地方?
0.10修改了Streams API并添加了以下行为更改:
警告 :如果你永远不会添加一个
'data'
事件处理程序,或者调用resume()
,那么它将永远处于暂停状态,永远不会发出'end'
。
所以,在0.10中,stream将等待一个有效的监听器,比如一个pipe
,或者一个没有明确pause
的强制resume
。
另一方面,0.8以上的蒸汽将会立即开始发送'data'
,除非被指示pause
。 而且,在这种情况下,这会在超时和stream之间创build争用条件 – stream可能会在超时到期之前部分运行或者甚至完成。