Node.js有不同的消耗數據的選項。 流0,1,2,3等等......讀取(拉)vs管道(控制流)vs數據(推送)
我的問題是關於 的現實生活應用這些不同的選項。我很瞭解 可讀/讀,數據事件和 Pipe之間的區別,但對選擇特定的 方法不太自信。
例如,如果我想使用流量控制,請使用 閱讀使用一些手動工作以及管道。 數據事件忽略流量控制,我應該停止使用 純數據事件嗎?
Node.js有不同的消耗數據的選項。 流0,1,2,3等等......讀取(拉)vs管道(控制流)vs數據(推送)
我的問題是關於 的現實生活應用這些不同的選項。我很瞭解 可讀/讀,數據事件和 Pipe之間的區別,但對選擇特定的 方法不太自信。
例如,如果我想使用流量控制,請使用 閱讀使用一些手動工作以及管道。 數據事件忽略流量控制,我應該停止使用 純數據事件嗎?
對於大多數的事情,你應該能夠使用
src.pipe(dest);
如果你看一下the source code for the Stream.prototype.pipe implementation,你可以看到,它只是一個非常方便的包裝,爲您
對於all the work I do with streams完成所有設置,我通常只選擇適當的流類型(Readable
,Writable
,Duplex
,Transform
或PassThrough
),然後定義適當的方法(_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"}'
謝謝naomik。我的問題主要是針對內置的流而不是自定義/用戶定義的流。 –
@PK,我很高興你這樣說。你不是真的應該直接使用內建的流對象。你打算爲它們「分類」。請參閱我更新的帖子。 – naomik
或許https://www.youtube.com/watch?v=QgEuZ52OZtU有幫助:-) –
感謝Golo Roden,迄今爲止最好的視頻流。我喜歡「隨着時間的推移」:) –