如何检查 node.js 中管道链的完成情况?

How to check completion of a pipe chain in node.js?

例如,我有这个:

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 () { ... });

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

您正在查找 finish 活动。来自 docs:

When the end() method has been called, and all data has been flushed to the underlying system, this event is emitted.

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

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

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

我听过 Nodejs Stream 贡献者的演讲之一,他们介绍这个功能是为了 'replace' 这些 Writable.pipe()Readable.pipe(),因为 pipeline 当出现防止内存泄漏的错误时,将自动关闭所有链接流。旧的运算符仍然会存在,以避免破坏以前的版本,我们大多数人都在使用它。

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

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