2017-03-08 42 views
0

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事件觸發後做異步操作。手冊說這是不可能的。

什麼是對的,什麼是錯的?

+0

在'exit'事件處理程序中調用'process.exit(code);'是非常奇怪的。我想知道這是否會實際觸發你所有的處理程序兩次。 – Bergi

+0

@Bergi它確實,所以我檢查'finishedAt'不是未定義的。另外,當你觸發'SIGINT'時,'exit'事件也被調用。 – DanFromGermany

+0

@Bergi除了我是如何做的之外,你有關於關機處理程序的想法嗎?我的解決方案唯一的缺點是,當有另一個出口監聽器,並且當我在另一個監聽器之前執行'process.exit()'時有機會不被執行。 – DanFromGermany

回答

1

這是因爲您手動發出的名稱爲exit的事件本身不會導致任何特殊行爲。只有在您使用process.exit時才如

if (errors) 
    process.exit(1); 

它將具有文檔中描述的效果。

+0

調用'.exit()'和發出'exit'事件之間的區別應該在文檔中更清楚,但是您的回答有助於理解它不相同。 – DanFromGermany