我有一个 Node v10.14.1 程序,它使用以下命令逐行读取 CSV 文件读取线接口
My .on('line')
is an async
回调执行一些从数据库读/写的操作,因此我使用async/await
来处理承诺。
该程序感兴趣的代码块的简短版本如下所示:
const readline = require('readline');
const filesystem = require('fs');
const reader = readline.createInterface({
input: filesystem.createReadStream(pathToSomeCSV)
});
reader.on('line', async (line) => {
await doSomeDBStuff();
})
如果我保持上面的原样,该过程不会退出。然而,如果我
reader.on('close', () => {process.exit()});
然后进程在所有之前退出on('line')
回调完成并且它们的承诺得到解决。
我的问题是:有没有办法说“在读取所有行并且所有on('line')
回调完成并解决了他们的承诺,然后退出该过程(我假设process.exit()
)"?
调查
我感觉文档遗漏了一些不明显的细节。我无法得到这个官方的例子工作正常(这就是你的问题似乎基于的)。该实现会过早地终止我的应用程序。或者,如果我删除了'close'
听众,终端将在退出时永远挂起。我尝试覆盖process.on('exit')
无济于事。我也尝试过提示同步包,但它始终损坏我的终端。
Solution
I found 这里有一个可爱的答案这提供了一个很好的解决方案。
创建函数:
const prompt = msg => {
fs.writeSync(1, String(msg));
let s = '', buf = Buffer.alloc(1);
while(buf[0] - 10 && buf[0] - 13)
s += buf, fs.readSync(0, buf, 0, 1, 0);
return s.slice(1);
};
Use it:
const result = prompt('Input something: ');
console.log('Your input was: ' + result);
没有终端损坏,应用程序不会过早终止,也不会在退出时挂起。
然而,这个解决方案并不完美 - 它在等待用户输入时故意阻塞主线程,这意味着您在等待用户输入时无法在后台运行其他函数。在我看来,用户输入在大多数情况下应该是线程阻塞的,所以这个解决方案对我个人来说非常有效。
Edit:查看 Linux 的改进版本here.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)