我有一個無操作變換流測試,輸出通過它傳遞的所有文件的列表。爲什麼下面的代碼只輸出一次文件列表?如何正確組合兩個流?構造Node.js中的兩個變換流
var composed = test().pipe(test());
gulp.src('source/*').pipe(composed);
我有一個無操作變換流測試,輸出通過它傳遞的所有文件的列表。爲什麼下面的代碼只輸出一次文件列表?如何正確組合兩個流?構造Node.js中的兩個變換流
var composed = test().pipe(test());
gulp.src('source/*').pipe(composed);
要撰寫流,你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 -> ...
pipe()
返回流被管道輸送到,不從(以允許鏈接)。所以第二行基本上是試圖管到test()
的第二個實例。你需要做的,而不是什麼是:
var first = test();
first.pipe(test());
gulp.src('source/*').pipe(first);
或者:
gulp.src('source/*')
.pipe(test())
.pipe(test());
太棒了。我不知道爲什麼我自己無法弄清楚。 –
(第二個對我來說不是一個選項,因爲它不是一個合成流,雖然在大多數情況下你應該這樣做。) –
這就是我最終做的。問題在於這樣的「組合」操作的結果是不一致的:它具有第二流的「管道」,但是第一流的事件和屬性。更簡潔的方法是從頭開始創建一個新的流類,但是有各種各樣的流類型,根據傳遞流的類型,結果流可能是'Readable','Transform'的'Writable'。我還沒有找到一種方法來檢查流類型,使其成爲可能。 –
是的。你也可以覆蓋返回的s1的'on()'方法來鏈接到's2'來處理事件,但是* still *不會提供屬性。完整的解決方案將是實現一個全新的流。 –
正如在這裏回答:[怎樣編寫變換流在節點js](http://stackoverflow.com/questions/23697831/how-to-compose-transform-streams-in-node-js )可以使用模塊[multipipe](https://www.npmjs.org/package/multipipe)來組合流。 – hmalphettes