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 退出。
我究竟做错了什么?
如上所述,问题是您的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)
| 归档时间: |
|
| 查看次数: |
4038 次 |
| 最近记录: |