【问题标题】:Node.js: stop execution of all code except a single function?Node.js:停止执行除单个函数之外的所有代码?
【发布时间】:2019-02-25 12:48:50
【问题描述】:

除了单个异步函数之外,是否可以停止所有 Node.js 代码的执行?

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

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

【问题讨论】:

  • 异步函数对程序其余部分的依赖程度如何?也许它可以变成自己的程序/在不同的服务器上,这样它就可以运行直到完成
  • 我可以复制一些变量,但是会很乱。

标签: javascript node.js


【解决方案1】:

这是一个有趣的用例...您可以做的一件事是创建一个分离的 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);
  }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多