我在检测管道流结束时遇到问题。脚步:
这是检测管道流读写结束的正确方法。
var inp = fs.createReadStream(fileName);
var out = fs.createWriteStream(fileName + '.gz');
var gzip = zlib.createGzip();
inp.pipe(gzip).pipe(out);
out.on('finish', function () { ....
Run Code Online (Sandbox Code Playgroud)
对比
var inp = fs.createReadStream(fileName);
var out = fs.createWriteStream(fileName + '.gz');
var gzip = zlib.createGzip();
var zipStream = inp.pipe(gzip).pipe(out);
zipStream.on('finish', function () { ....
Run Code Online (Sandbox Code Playgroud)
如文档https://nodejs.org/api/stream.html 中所述:
'finish': 在调用 stream.end() 方法之后发出,并且所有数据都已刷新到底层系统。'end': 当没有更多数据要从流中消费时发出。事件:“完成”和“结束”
'
finish' 和 'end' 事件分别来自stream.Writable和stream.Readable类。该'finish'事件被发出后,stream.end()被称为和所有块已被处理stream._transform()。'end' 事件在所有数据输出后发出,该事件发生在回调 intransform._flush()被调用之后。
因此,在您的示例中,顺序将是:
inp(可读流)将发出“ end”gzip(transformer): 将发出一个 ' end' 和 ' finish' ( transformer 是双工流)out(可写流):finish当所有数据都被写入时,最终会发出一个 ' '。| 归档时间: |
|
| 查看次数: |
4079 次 |
| 最近记录: |