我有一个节点v10.14.1程序,该程序使用readline接口读取CSV文件线
我的.on('line')
是async
回调执行一些从DB读取/写入的操作,因此我使用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')
,无济于事。我还尝试了及时的同步软件包,但它一直损坏我的终端。
解决方案
我在这里找到了一个可爱的答案,该答案提供了一个很好的解决方案。
创建功能:
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);
};
使用它:
const result = prompt('Input something: ');
console.log('Your input was: ' + result);
没有末期腐败,应用程序不会过早死亡,也不会挂在退出。
。此解决方案并不完美 - 它在等待用户输入时故意阻止主线程,这意味着您在等待用户输入时无法在后台运行其他功能。在我的脑海中,用户输入在大多数情况下都应该是螺纹障碍,因此该解决方案对我个人非常有效。
编辑:请参阅此处的Linux的改进版本。