【发布时间】:2020-07-19 04:47:46
【问题描述】:
假设我有以下代码:
try {
let size = 0;
await pipeline(
fs.createReadStream('lowercase.txt'),
async function* (source) {
for await (const chunk of source) {
size += chunk.length;
if (size >= 1000000) {
throw new Error('File is too big');
}
yield String(chunk).toUpperCase();
}
},
fs.createWriteStream('uppercase.txt')
);
console.log('Pipeline succeeded.');
} catch (error) {
console.log('got error:', error);
}
如何确保在每种情况下都正确关闭流? node docs 并没有多大帮助——他们只是告诉我,我将有悬空的事件监听器:
stream.pipeline() 将对所有流调用 stream.destroy(err),除了:
发出 'end' 或 'close' 的可读流。
发出“finish”或“close”的可写流。
stream.pipeline() 在调用回调后将悬空事件侦听器留在流上。在失败后重用流的情况下,这可能会导致事件侦听器泄漏和吞噬错误。
【问题讨论】:
-
我还注意到该文档在这个主题上奇怪地不完整,这就是我自己从未使用过
pipeline()的原因。我认为我只需将自己的承诺包装在我可以完全控制错误处理的事情上。我是那种宁愿自己编写代码也不愿与预制但记录不充分的代码搏斗的人。鬼鬼祟祟的控制与你不明白如何正确使用的预制代码。 -
@jfriend00 这对我来说很有意义。如果问得不算多,您能否使用 Promise 和事件侦听器编写上述代码的一个版本?将不胜感激并接受它作为答案:)
标签: javascript node.js stream pipe pipeline