Node.js:停止执行除单个功能以外的所有代码吗?

时间:2019-02-25 01:26:00

标签: javascript node.js

是否可以停止执行除单个异步功能以外的所有Node.js代码?

有点像运行process.exit(),但process.exit()仅允许同步功能。

即一种退出当前调用堆栈,清除消息队列,注销所有事件处理程序,然后运行单个异步功能的方法?

1 个答案:

答案 0 :(得分:0)

这是一个有趣的用例...您可以做的一件事是派生一个独立的child_process来为您处理异步清理。这样,您可以向子级发送一条消息,提示其执行任何清除操作,然后在父级上触发process.exit()以停止其进程。子级应该通过清空其自己的事件循环自然退出,但为防万一,我在清理代码中添加了另一个process.exit()

app.js

const { fork } = require('child_process');
const subProcess = fork(`${__dirname}/cleanup.js`, {
  detached: true
});

//ensure parent can exit independent of child
subProcess.unref();

setTimeout(() => {
  //do some standard node.js, async stuff
  //all done... send clean up message and exit parent
  subProcess.send({ exit: true });
  //disconnect to sever any further communication
  subProcess.disconnect()
  process.exit(1);
}, 5000)

cleanup.js

asyncCleanUp();

async function asyncCleanUp(){
  setTimeout(() => {
    console.log('async cleanup completed... exiting.')
  }, 5000)
  return 'done'
}

console.log('cleanup script forked');
process.on('message', async (message) => {
  console.log(message)
  if(message.exit) {
    const result = await asyncCleanUp();
    console.log(result);
    process.exit(1);
  }
});