【问题标题】:How to check completion of a pipe chain in node.js?如何检查 node.js 中管道链的完成情况?
【发布时间】:2015-11-05 00:44:46
【问题描述】:

例如,我有这个:

var r = fs.createReadStream('file.txt');
var z = zlib.createGzip();
var w = fs.createWriteStream('file.txt.gz');
r.pipe(z).pipe(w);

我想在 r.pipe(z).pipe(w) 完成后做点什么。我试过这样的事情:

var r = A.pipe(B);
r.on('end', function () { ... });

但它不适用于管道链。 我怎样才能让它发挥作用?

【问题讨论】:

    标签: javascript node.js pipe chain


    【解决方案1】:

    您正在寻找finish 事件。来自docs

    当 end() 方法已被调用,并且所有数据都已刷新到底层系统时,会发出此事件。

    当源流发​​出end 时,它会在目标上调用end(),在您的情况下,目标是B。所以你可以这样做:

    var r = A.pipe(B);
    r.on('finish', function () { ... });
    

    【讨论】:

    • 可能你误解了我的意思。我专注于“链条”。你说的适用于 A 和 B,但是如果我有 A.pipe(B).pipe(C),C 怎么样?
    • 哦,对不起。你是对的 :) 非常感谢。
    【解决方案2】:

    在 v10 中引入了一个名为 pipeline 的新 NodeJS 运算符。

    我听过 Nodejs Stream 贡献者的演讲之一,他们引入了这个功能来“替换”这些 Writable.pipe()Readable.pipe(),因为 pipeline 会自动关闭所有链接流存在防止内存泄漏的错误。旧的运营商仍然会在那里,以避免破坏以前的版本,我们大多数人都在使用它。

    对于您的用例,我建议您需要根据文档使用 v14,pipeline 将在调用回调之前等待关闭事件。

    https://nodejs.org/api/stream.html#stream_stream_pipeline_streams_callback

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 2017-09-03
      • 1970-01-01
      相关资源
      最近更新 更多