首页 > 解决方案 > 将“end”设置为“false”的流在可写流完成之前解析

问题描述

我写了一个函数,它在管道一个可读流之后返回一个已解决的承诺。有两个管道。第一个管道是转换,第二个管道是可写流。我不想关闭可写流,所以我传入{end:false}了 writer/pipe 参数。转换和可写流独立工作(即只有一个管道),但当我链接它们时不是。

根据我看到的所有示例,为了知道该过程何时完成,我添加了readable.on('end'). 它没有按预期工作。

pipe(readable, transform, writable){
    return new Promise((resolve, reject) => {
        readable
            .pipe(transform)
            .pipe(writable, {end:false})
            .on('error', (error) => {
                console.error(error)
                reject(error);
            })
        readable.on('end', () => {
                writable.end();
                resolve();
            });
    });
}
  1. 如果我调用writable.end()什么都不会写入文件
  2. 如果我不称writable.end()它实际上完全按照它应该做的那样做,但是它过早地解决了承诺......文件仍在被写入。
  3. 如果我不使用{end:false}并且只是正常执行此操作,它可以正常工作。问题是我希望可写流保持打开状态。

标签: javascriptnode.js

解决方案


在尝试了每个事件之后writable.on('unpipe'),我需要指示写入已完成的处理程序。

pipe(readable, transform, writable){
    return new Promise((resolve, reject) => {
        readable
            .pipe(transform)
            .pipe(writable, {end:false})
            .on('unpipe', () => {
                 resolve();
                 // this must be called somewhere!
                 // writable.end();
             })
            .on('error', (error) => {
                console.error(error)
                reject(error);
            })
    });
}

推荐阅读