在 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),确保程序能够正常退出。

Node.js 异步方法执行完毕后退出程序:使用 Promise 实现同步锁效果

原文地址: https://www.cveoy.top/t/topic/ph6s 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录