2013-07-12 159 views
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(); 

documentation說,該停頓諮詢,這讓我感到困惑。爲什麼我應該暫停流,哪裏沒有連接到任何地方?

回答

4

0.10 revamped the Streams API並添加行爲進行以下更改:

警告:如果您從未添加'data'事件處理程序,或致電resume(),那麼它會坐在處於暫停狀態,永不發出'end'

所以,在0.10,流將等待有效的傾聽者,就像一個pipe,或被迫resume沒有明確pause

另一方面,0.8以上的蒸汽將立即開始發送'data',除非指示pause。而且,在這種情況下,會在超時和流之間創建爭用條件 - 流可能會在超時到期之前部分運行甚至完成。

+0

我認爲舊樣式(0.10之前)的流不應該被稱爲流,但別的東西。我認爲,對於那些對某種流API應該看起來像是來自其他語言的用戶有一定期待的人們來說,這是非常混亂的根源。 –

+0

@UstamanSangat「* stream *」只是隨時間傳輸的順序數據;他們當然是那樣的。值得讚揚的是完全不同的辯論問題。但是,期待一種語言的功能在另一種語言中完全匹配通常不是一個安全的選擇。 –

+1

好......但顯然他們投入並認識到在0.10 ;-) –