我在 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/