【发布时间】:2021-09-15 14:30:16
【问题描述】:
我试图让fs.createReadStream 作为一个承诺工作,所以在读取整个文件后,它将被解析。
在下面的情况下,我暂停流,执行等待方法并恢复。
- 如何使
.on('end'...最终被执行。 - 如果 1. 不可能,为什么 `.on('不会被解雇',也许我可以用它来解决承诺。
function parseFile<T>(filePath: string, row: (x: T) => void, err: (x) => void, end: (x) => void) {
return new Promise((resolve, reject) => {
const stream = fs.createReadStream(filePath);
stream.on('data', async data => {
try {
stream.pause();
await row(data);
} finally {
stream.resume();
}
})
.on('end', (rowCount: number) => {
resolve();// NOT REALLY THE END row(data) is still being called after this
})
.on('close', () => {
resolve();// NEVER BEING CALLED
})
.on('error', (rowCount: number) => {
reject();// NEVER GETS HERE, AS EXPECTED
})
})
}
更新
在这里你可以实际测试一下:https://stackblitz.com/edit/node-czktjh?file=index.js
运行node index.js
输出应该是 1000 而不是 1
谢谢
【问题讨论】:
-
这里可能出现的问题之一是您正在暂停输入流,而不是 csv 解析流。
.on('data', ...)来自 csv 流,因此您不会暂停它。 -
请记住,来自 readStream 的单个数据块可能会导致多行 csv,从而导致来自 csv 流的多个
data事件。您还必须测试 csv 流是否注意流暂停。有些流有,有些则没有。 -
@jfriend00 谢谢,我正在创建一个公共容器以便您可以运行它,移除管道没有帮助
-
@jfriend00 - 请看我的更新
-
在您将问题编辑为的简化代码中,我无法重现您描述的问题。