2014-05-07 57 views
1

我有一個無操作變換流測試,輸出通過它傳遞的所有文件的列表。爲什麼下面的代碼只輸出一次文件列表?如何正確組合兩個流?構造Node.js中的兩個變換流

var composed = test().pipe(test()); 
gulp.src('source/*').pipe(composed); 

回答

2

要撰寫流,你pipe()第一至第二,但你也必須修改pipe()unpipe()使它們適用於第二流。通過這種方式,合成流上pipe()的其他調用將使用第二個流的輸出而不是第一個流。

function compose(s1, s2) { 
    s1.pipe(s2); 
    s1.pipe = function (dest) { 
     return s2.pipe(dest); 
    } 
    s1.unpipe = function (dest) { 
     return s2.unpipe(dest); 
    } 
    return s1; 
} 

var composed = compose(test(), test()); 
gulp.src('source/*') 
    .pipe(composed) // src -> s1 -> s2 
    .pipe(...);  // s2 -> ... 
+0

這就是我最終做的。問題在於這樣的「組合」操作的結果是不一致的:它具有第二流的「管道」,但是第一流的事件和屬性。更簡潔的方法是從頭開始創建一個新的流類,但是有各種各樣的流類型,根據傳遞流的類型,結果流可能是'Readable','Transform'的'Writable'。我還沒有找到一種方法來檢查流類型,使其成爲可能。 –

+1

是的。你也可以覆蓋返回的s1的'on()'方法來鏈接到's2'來處理事件,但是* still *不會提供屬性。完整的解決方案將是實現一個全新的流。 –

+0

正如在這裏回答:[怎樣編寫變換流在節點js](http://stackoverflow.com/questions/23697831/how-to-compose-transform-streams-in-node-js )可以使用模塊[multipipe](https://www.npmjs.org/package/multipipe)來組合流。 – hmalphettes

1

pipe()返回流被管道輸送到,不(以允許鏈接)。所以第二行基本上是試圖管到test()的第二個實例。你需要做的,而不是什麼是:

var first = test(); 
first.pipe(test()); 
gulp.src('source/*').pipe(first); 

或者:

gulp.src('source/*') 
    .pipe(test()) 
    .pipe(test()); 
+0

太棒了。我不知道爲什麼我自己無法弄清楚。 –

+0

(第二個對我來說不是一個選項,因爲它不是一個合成流,雖然在大多數情況下你應該這樣做。) –