【发布时间】:2014-06-24 13:46:31
【问题描述】:
我有一个无操作转换流测试,它输出通过它的所有文件的列表。为什么以下代码只输出文件列表一次?如何正确组合两个流?
var composed = test().pipe(test());
gulp.src('source/*').pipe(composed);
【问题讨论】:
我有一个无操作转换流测试,它输出通过它的所有文件的列表。为什么以下代码只输出文件列表一次?如何正确组合两个流?
var composed = test().pipe(test());
gulp.src('source/*').pipe(composed);
【问题讨论】:
pipe() 返回通过管道传输的流到,而不是来自(以允许链接)。所以第二行基本上是试图通过管道连接到test() 的第二个实例。你需要做的是:
var first = test();
first.pipe(test());
gulp.src('source/*').pipe(first);
或者:
gulp.src('source/*')
.pipe(test())
.pipe(test());
【讨论】:
要组合流,您需要将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 -> ...
【讨论】:
compose 操作的结果不一致:它有第二个流的pipe,但是第一个流的事件和属性。更简洁的方法是从头开始创建一个新的流类,但有多种流类型,根据传递的流类型,生成的流可能是Transform 的Readable、Writable。我还没有找到一种方法来检查流类型以使其成为可能。
on() 方法以链接到 s2 以获取事件,但是 still 不提供属性。完整的解决方案是实现一个全新的流。