我正在通过使用自定义exit
事件运行异步清除代码,然后在所有清除代码运行后调用process.exit()
。
但是,在触发自定义exit
事件之后,脚本的其余部分仍然执行。相反,当我调用process.exit()
时,脚本的其余部分将立即停止。
现在,我只是在整个脚本中监听exit
事件并注销回调。但是,这很繁琐且容易出错。
是否有更好的方法可以使脚本的其余部分立即停止,但仍然能够运行异步清理代码?
例如:
process.on('SIGINT', () => {
Promise.race([
Promise.all(
process.listeners('beforeExit')
.map(cb => cb())
.filter(ret => ret instanceof Promise),
),
pause(5000, new Error('_handleBeforeExit timed out.')),
])
.catch((err) => {
ErrorLogger.fatal(err, '_handleBeforeExit');
})
.then(() => ErrorLogger.shutdown(2000))
.finally(() => process.exit());
});
...
// Random part of the script
ws.on('msg', () => doSomething);
...
// Another random part
if (!someCondition) {
process.emit('SIGINT'); // Here, I want doSomething to never run again without having to manually unregister everything
return;
}