【问题标题】:node.js conditional stream pipenode.js 条件流管道
【发布时间】:2020-05-13 04:30:48
【问题描述】:

我正在尝试了解如何最好地有条件地将流通过管道传输到 Transform 或类似而不使用 3rd 方库。

理想情况下我想做这样的事情

const transformA, transformB = // my transforms
const booleanA, booleanB = // my various conditions

const stream = new Readable()
stream.push('...') // my content

return stream
         .pipe(booleanA && transformA)
         .pipe(booleanB && transformB)

我曾尝试使用 detour-streamternary-stream 等库进行此操作,但我遇到了各种奇怪的副作用,其中不应该调用转换、抛出错误等,这让我想知道人们如何在不增加这些库的复杂性的情况下完成这类事情。

在此期间,我通过采用命令式方法解决了这个问题,在每个条件下重新分配流。

let stream = // get my stream

if (condition) stream = stream.pipe(someTransform)
if (otherCondition) stream = stream.pipe(otherTransform)

return stream

这很好,但我仍然很好奇是否可以完成不可变和函数式方法

感谢观看和阅读

【问题讨论】:

    标签: node.js hapijs node-streams


    【解决方案1】:

    不幸的是,没有对条件管道的内置支持,没有任何第三方模块的替代方法是使用.pipeline

    const stream = require('stream');
    const pipeline = util.promisify(stream.pipeline);
    
    const read = new stream.Readable()
    
    const pipes = [
      booleanA && transformA,
      booleanB && transformB
    ].filter(Boolean); // remove empty pipes
    
    await pipeline(
       read,
       ...pipes
    );
    
    

    由于.pipeline 采用 N 个转换流,您可以从已过滤的管道数组中使用扩展运算符。

    如果您想返回最后一个管道流,可以删除pipeline 的 promisify 版本。

    return pipeline(
       read,
       ...pipes,
       () => {}
    )
    

    【讨论】:

    • 我已经实现了这一点,await pipeline(readableStream, pipe1, pipe2) 的结果未定义,但在这些转换中进行调试显示它们正在被调用 - 你的答案是否对stream 参数做出任何假设?
    • 但是您使用的是pipe1pipe2,这不是我的代码的工作方式,请使用console.log(pipes)
    • 抱歉,要明确的是,当我使用流和单个转换 const thisIsUndefined = await pipeline(stream, pipe1) 调用 pipeline 时,我得到了相同的结果——我的环境不支持解构,但我知道管道是一个转换数组——我认为你的代码应该和pipeline.call(this, [stream].concat(pipes))是一样的?
    • 可能有一个错误,因为您将stream 用于读取流,而我用它来要求stream = require('stream')promisify 管道。
    • hmm 仍在测试这个——我认为这不是问题,我正在像这样导入import { pipeline as streamPipeline } from 'stream';——如果我不能让它工作,我会恢复到某种形式尽可能简单的沙箱示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2013-07-02
    • 2017-04-21
    • 1970-01-01
    • 2015-09-18
    • 2017-05-07
    • 2014-12-05
    相关资源
    最近更新 更多