Node.js 异步方法执行完毕后退出程序:使用 Promise 实现同步锁效果
在 Node.js 中,可以使用 process.on('SIGINT', callback) 监听 ctrl+c 事件,然后在回调函数中执行一些清理操作。但是,由于 Node.js 是单线程的,无法使用传统的同步锁来等待执行完成。可以使用一些技巧来模拟同步锁的效果。
一种方法是使用 Promise 来实现等待执行完成的效果。可以将 methodA 封装成一个返回 Promise 的函数,并使用 await 来等待它执行完成。
下面是一个示例代码:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function methodA() {
// 执行一些耗时操作
await sleep(3000);
console.log('methodA executed');
}
async function main() {
let running = true;
process.on('SIGINT', async () => {
console.log('SIGINT received. Waiting for methodA to finish...');
running = false;
});
while (running) {
await methodA();
}
console.log('Program terminated');
}
main().catch(console.error);
在上面的代码中,methodA 被封装成一个 async 函数,使用 await 等待它执行完成。当收到 SIGINT 事件时,将 running 标志设置为 false,从而退出循环。这样在下一次循环开始之前,会等待 methodA 执行完成。
需要注意的是,需要使用 async 函数来包裹主逻辑,以便能够使用 await 关键字。同时,需要使用 try/catch 语句块来捕获可能的错误。
另外,为了防止程序无法终止,可以使用 process.exit() 来手动退出程序。可以在 SIGINT 事件的回调函数中添加 process.exit(0),确保程序能够正常退出。
原文地址: https://www.cveoy.top/t/topic/ph6s 著作权归作者所有。请勿转载和采集!