node.js - 捕捉 Ctrl-C 在 Node 中如何工作?

标签 node.js events signals sigint

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

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

while(1) {

}

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

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

我做错了什么?

最佳答案

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

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();
  }
})();

由于 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);

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

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

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

关于node.js - 捕捉 Ctrl-C 在 Node 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22594723/

相关文章:

node.js - 如何解决 Node 库(如异步和请求)的 'this' 问题

javascript - OUT 在命令行中总是为空,但在 SQL 客户端中却不是?

ruby-on-rails - 如果我不需要实时功能,为什么要使用 Node.js?

android - 通过蓝牙 (Android) 来自 QardioCore 的原始 ECG 信号

linux - 哪些系统调用不会被信号中断?

python - 如何从不同进程向 GUI 中的插槽发送信号?

macos - NPM 的问题

javascript - 访问 anchor 属性和 event.preventDefault()

c# - 触发表单按键事件

javascript - Socket.io 客户端 : respond to all events with one handler?