https://nodejs.org/api/process.html`中的node.js exit`事件表現得與手動
監聽功能必須僅執行同步操作不同。 Node.js進程在調用'exit'事件 偵聽器後會立即退出,導致放棄在事件循環 中排隊的任何其他工作。在下面的例子,例如,將永遠不會發生超時 :
process.on('exit', (code) => {
setTimeout(() => {
console.log('This will not run');
}, 0);
});
現在我有這個在我main.js:
if (errors) {
process.exitCode = 1;
}
process.emit("exit");
在具有關機聽衆等我一個記錄儀具有蒙戈連接和以下:
process.on("exit", (code) => {
if (this.status.finishedAt === null) {
this.status.currentState = StatusUpdater.STATE_STOPPED;
this.status.finishedAt = new Date();
this.persistStatus()
.then(() => {
this.mongoDb.close().then(() => {
setTimeout(() => {
console.log('byebye');
process.exit(code);
}, 5000);
});
})
.catch(this.noMongoConnection);
}
});
的輸出是:byebye
秒後,210秒鐘,。
現在我很困惑。很明顯,我可以在exit
事件觸發後做異步操作。手冊說這是不可能的。
什麼是對的,什麼是錯的?
在'exit'事件處理程序中調用'process.exit(code);'是非常奇怪的。我想知道這是否會實際觸發你所有的處理程序兩次。 – Bergi
@Bergi它確實,所以我檢查'finishedAt'不是未定義的。另外,當你觸發'SIGINT'時,'exit'事件也被調用。 – DanFromGermany
@Bergi除了我是如何做的之外,你有關於關機處理程序的想法嗎?我的解決方案唯一的缺點是,當有另一個出口監聽器,並且當我在另一個監聽器之前執行'process.exit()'時有機會不被執行。 – DanFromGermany