是否可以停止执行除单个异步功能以外的所有Node.js代码?
有点像运行process.exit()
,但process.exit()
仅允许同步功能。
即一种退出当前调用堆栈,清除消息队列,注销所有事件处理程序,然后运行单个异步功能的方法?
答案 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);
}
});