如何检查 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
例如,我有这个:
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