在 Node 中捕获 Ctrl-C 是如何工作的?

Ere*_*evi 5 events signals sigint node.js

我在 Ubuntu 上的 Node.js 中有以下程序:

process.on ("SIGINT", function(){
    console.log("You clicked Ctrl+C!");
    process.exit(1);
});

while(1) {

}
Run Code Online (Sandbox Code Playgroud)

当我单击 Ctrl+C 时,我在屏幕上看到“^C”,但没有打印任何其他内容,进程也不会退出。

如果没有“process.on...”语句,Ctrl+C 会立即导致 Node 退出。

我究竟做错了什么?

Iol*_*olo 4

如上所述,问题是您的while循环永远不会产生并且阻塞事件循环。如果您需要使用 while 循环,那么使循环成为async至少调用 1 次的函数的一部分await将解决此问题:

const pause = () => new Promise(res => setTimeout(res, 0));

process.on ('SIGINT',() => {
  console.log('You clicked Ctrl+C!');
  process.exit(1);
});

(async function() {

  while(true) {
    console.log('Running Code');
    await pause();
  }
})();
Run Code Online (Sandbox Code Playgroud)

由于 async/await 是 Promises 的语法糖,并且并非所有环境都支持 async/await,因此如果您处于较不现代的环境中,您也可以直接使用 Promises 执行此操作,但代码会大不相同:

const pause = () => new Promise(res => setTimeout(res, 0));

process.on ('SIGINT',() => {
  console.log('You clicked Ctrl+C!');
  process.exit(1);
});

const main = () => new Promise(() => {
  // do stuff
  console.log('Running Code');
});

function loop(task) {
  task();
  return pause().then(() => {
    task();
    return loop(task);
  });
}

loop(main);
Run Code Online (Sandbox Code Playgroud)

最后,如果您不使用带有 Promises 的环境,也只需while用间隔替换循环即可:

process.on ('SIGINT',() => {
  console.log('You clicked Ctrl+C!');
  process.exit(1);
});

setInterval(() => {
  console.log('Running Code');
}, 0)
Run Code Online (Sandbox Code Playgroud)