2015-09-11 51 views
1

我正在做「流冒險」練習,我對stream-combiner模塊很不確定。如何將可讀流傳遞給其他可讀流?

具體而言,它說的是:

stream-combiner模塊創建從 流的列表的管線,返回暴露第一流作爲 可寫入側和最後流作爲可讀側單個流比如 duplexer模塊,但是其間具有任意數量的流。 與duplexer模塊不同,每個流都被傳送到下一個。對於 例如:

var combine = require('stream-combiner'); 
var stream = combine(a, b, c, d); 

將在內部做a.pipe(b).pipe(c).pipe(d)combine()返回stream 有其寫一邊勾搭成a及其 可讀側鉤到d。現在

,因爲它說,「它寫邊勾搭成a及其可讀側勾搭成d」,一個可以用上面的stream喜歡如下:

someReadableStream.pipe(stream).pipe(someWritableStream) 

,但將不只是以上成爲:

someReadableStream.pipe(a).pipe(b).pipe(c).pipe(d).pipe(someWritableStream) 

我的問題是如何可讀流管道到另一個可讀流。最後,如何將可寫入流的管道結果再次輸送到可寫流中。

+0

看看PassThrough流。這可能是你需要的。 –

+0

@MattHarrison我猜你誤解了我,我的疑惑是爲什麼上述的作品? :) –

+0

'a'和'd'必須是可讀寫的。 –

回答

1

這裏有一個文字的例子,希望澄清有關流的規則,以便流組合做一些有用的東西:

var rw = combine(r_or_rw, rw1, rw2, rw3, ...rwN, w_or_rw) 

所以先流需要至少可讀,內部流都需要讀/寫,最後的流至少需要可寫。返回的新流是可讀寫的。當你寫入返回的流時,它通過流水線向下發送新的數據,當你讀到這個數據時,你會從流水線的末端獲得數據。

+0

我得到了聯合的概念,但我不明白如何才能將數據寫入流,因爲新流的第一部分是可讀流 –

+0

因此,如果'stream1'是隻讀的,您將無法寫入返回的流,但是如果它是讀取/寫入,寫入返回的流將寫入stream1並流過管道。取決於最後一個流是隻寫還是讀/寫,最後情況類似。我認爲stream-combiner API爲您提供了一個r/w流的多功能性,但依賴於您知道將會和不會工作的組合。 –

+0

這很有道理!他們的文檔非常差 –

0

你是對的,它和readable.pipe(a).pipe(b).pipe(c).pipe(d).pipe(writable), 一樣,組合器的優點是你不能從函數返回a.pipe(b).pipe(c).pipe(d),所以你必須總是手動連接它們。通過組合器,您可以創建其他流的流,然後將其整理到功能或模塊中。

爲此工作,雖然a,b,c,d都必須是變換流,它們都是可讀寫的。

相關問題