在Node.js中组合两个Transform流

时间:2014-05-07 14:13:30

标签: node.js stream gulp

我有一个无操作的转换流测试,它输出通过它传递的所有文件的列表。为什么以下代码只输出一次文件列表?如何正确组合两个流?

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

2 个答案:

答案 0 :(得分: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 -> ...

答案 1 :(得分:1)

pipe()会将通过传输到的流,而不是传递(以允许链接)。所以第二行基本上是试图管道到test()的第二个实例。你需要做的是:

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

或者:

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