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

时间:2014-03-23 17:54:20

标签: 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立即导致节点退出。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

如上所述,问题是您的while循环永远不会产生并阻挡event loop。如果您需要使用while循环,那么使async函数的循环部分至少有一个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();
  }
})();

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

最后,如果你没有使用带Promise的环境,那么也只是用一个间隔替换while循环:

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

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