【问题标题】:Compose two Transform streams in Node.js在 Node.js 中组合两个 Transform 流
【发布时间】:2014-06-24 13:46:31
【问题描述】:

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

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

【问题讨论】:

    标签: node.js stream gulp


    【解决方案1】:

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

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

    或者:

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

    【讨论】:

    • 太棒了。我不知道为什么我自己无法弄清楚这一点。
    • (第二个对我来说不是一个选项,因为它不是一个组合流。虽然在大多数情况下你应该这样做。)
    【解决方案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 -> ...
    

    【讨论】:

    • 这就是我最终所做的。问题是这种compose 操作的结果不一致:它有第二个流的pipe,但是第一个流的事件和属性。更简洁的方法是从头开始创建一个新的流类,但有多种流类型,根据传递的流类型,生成的流可能是TransformReadableWritable。我还没有找到一种方法来检查流类型以使其成为可能。
    • 是的。您还可以覆盖返回的 s1 的 on() 方法以链接到 s2 以获取事件,但是 still 不提供属性。完整的解决方案是实现一个全新的流。
    • 在这里回答:how-to-compose-transform-streams-in-node-js 可以使用模块multipipe 来组合流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2021-02-19
    • 2018-05-02
    • 2013-07-02
    • 2019-01-12
    • 1970-01-01
    • 2019-03-20
    相关资源
    最近更新 更多