2014-03-31 16 views
2

Node.js有不同的消耗數據的選項。 流0,1,2,3等等......讀取(拉)vs管道(控制流)vs數據(推送)

我的問題是關於 的現實生活應用這些不同的選項。我很瞭解 可讀/讀,數據事件和 Pipe之間的區別,但對選擇特定的 方法不太自信。

例如,如果我想使用流量控制,請使用 閱讀使用一些手動工作以及管道。 數據事件忽略流量控制,我應該停止使用 純數據事件嗎?

+1

或許https://www.youtube.com/watch?v=QgEuZ52OZtU有幫助:-) –

+1

感謝Golo Roden,迄今爲止最好的視頻流。我喜歡「隨着時間的推移」:) –

回答

5

對於大多數的事情,你應該能夠使用

src.pipe(dest); 

如果你看一下the source code for the Stream.prototype.pipe implementation,你可以看到,它只是一個非常方便的包裝,爲您

對於all the work I do with streams完成所有設置,我通常只選擇適當的流類型(Readable,Writable,Duplex,TransformPassThrough),然後定義適當的方法(_read,_write和/或_transform)在流。最後,我用.pipe來連接所有的東西。

這是非常普遍地看到,似乎是「循環」流設置

client.pipe(encoder).pipe(server).pipe(decoder).pipe(client) 

作爲一個例子,這裏的流,我用我的burro模塊。您可以對象寫入此流,並且您可以從中讀取 JSON字符串。

// https://github.com/naomik/burro/blob/master/lib/encoder.js 
var stream = require("stream"), 
    util = require("util"); 

var Encoder = module.exports = function Encoder() { 
    stream.Transform.call(this, {objectMode: true}); 
}; 

util.inherits(Encoder, stream.Transform); 

Encoder.prototype._transform = function _transform(obj, encoding, callback) { 
    this.push(JSON.stringify(obj)); 
    callback(null); 
}; 

作爲一般性建議,您幾乎總是會這樣編寫Streams。也就是說,您可以編寫自己的「類」,該類繼承自其中一個內置流。直接使用內置流並不實際。


爲了演示如何使用這一點,通過創建流的新實例

var encoder = new Encoder(); 

看看通過管道它的編碼器輸出到stdout

encoder.pipe(process.stdout); 

寫一些啓動樣品對象

encoder.write({foo: "bar", a: "b"}); 
// '{"foo":"bar","a":"b"}' 

encoder.write({hello: "world"}); 
// '{"hello":"world"}' 
+0

謝謝naomik。我的問題主要是針對內置的流而不是自定義/用戶定義的流。 –

+0

@PK,我很高興你這樣說。你不是真的應該直接使用內建的流對象。你打算爲它們「分類」。請參閱我更新的帖子。 – naomik