我在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立即导致节点退出。
我做错了什么?
答案 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)