当所有 Readline on('line') 回调完成时退出过程



我有一个节点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的改进版本。

最新更新