2016-07-22 63 views
1

如何使用Node.js,當我運行程序的setTimeout從來不打電話

setTimeout(() => console.log("Timed out"), 0); 
console.log("finishing"); 

我看到

finishing 
Timed out 

但是,當我「完成」

前加一個罰球
setTimeout(() => console.log("Timed out"), 0); 
throw new Error(); 
console.log("finishing"); 

我看到

throw new Error(); 
^ 

Error 
    at Object.<anonymous> ...(stack trace here)... 

而且我沒有看到任何提及的「超時」。

這是爲什麼?即使初始上下文會拋出,一旦堆棧被釋放,我期望我傳遞給setTimeout的回調仍然會運行。

是否有未捕獲的異常導致所有超時被取消?此功能是否記錄在某處?

如果我有多個超時,是否有一種方法可以確保所有其他超時仍能繼續運行,即使它們中的一個發生了拋出?

+1

當代碼中存在未處理的異常時,程序將中止。 – thefourtheye

+0

你測試過哪個瀏覽器?無論是Firefox還是Chrome,*都會*記錄'超時'。 – str

+0

@str我沒有在任何瀏覽器上測試過,但我希望所有的瀏覽器都遵守setTimeout。問題是,當你在node.js上運行它時,它的工作方式不同。 – math4tots

回答

4

與在瀏覽器上運行的Web應用程序不同,Node應用程序作爲Google V8 JavaScript Engine之上的進程運行。如果你看看https://nodejs.org/api/timers.html是指出

內Node.js的定時器功能實現一個類似的API,通過Web瀏覽器提供的計時器API,但使用的是圍繞Node.js的事件循環建立了不同的內部實現。

正如上面的說明所解釋的那樣,即使在兩種情況下都有相同的全局函數,但它們的實現是不同的。因此,當節點應用程序中發生未捕獲的異常時,與超時有關的所有代碼將在進程終止時停止。處理這個問題的最好方法是正確處理所有異常。您可以使用以下代碼從流程級本身捕獲所有未捕獲的異常。

process.on('uncaughtException', function(error) { 
    console.log(error); 
}); 
+0

:')很好。你現在可以發表評論 –