2015-07-12 51 views
1

在做一些工作時,我看到Firebug中出現的「未捕獲的異常」錯誤出現在看似隨機的時刻。背景中的承諾引發了例外情況。在Firefox中隨機延遲後報告的Promise例外

起初我很驚訝錯誤被報告在所有,因爲我的理解是承諾錯誤只是簡單地捕捉並通過回調鏈傳遞。但是他們也會在post-Opera(= Chrome)中進行報道,並且他們不會殺死腳本,所以這是件好事。

但是在Opera中,例外情況會立即報告,而在Firefox中會有一些看似隨機的延遲(從幾秒到半分鐘)。這是爲什麼?

下面是測試代碼:

var p = new Promise(okLater); 
p.then(kill); 

function okLater(pass, fail) { 
    setTimeout(pass.bind(this, "O.K."), 10); 
} 

function kill() { 
    console.log("Killing"); 
    throw "Oops" 
} 
+1

我在移動設備上,但是 - 在Chrome中,未處理的拒絕跟蹤在所有微任務都過去並且沒有附加「catch」的情況下運行。在Firefox中,它基於垃圾收集,所以它不是確定性的,但可能更安全。 –

回答

2

起初我很驚訝於所有報告的錯誤,我的理解是,在承諾引發的錯誤只是抓住並沿回調鏈

通過

是的,他們確實如此。您通過p.then(kill)創建的承諾將被拒絕。

但我們並不真的想要那樣。被默默忽略的例外情況?不是一個好主意。所以我們需要未處理的拒絕處理。 「未處理的異常」是一個被拒絕的承諾,沒有附加錯誤處理程序。識別這些問題有點問題,因爲錯誤處理程序可能會在以後被故意附加,並且我們不希望這個承諾被報告。儘管如此,承諾實施有能力跟蹤他們的承諾並報告「可能未處理的拒絕」,詳情請參閱this answerHow do I handle exceptions globally with native promises in node.js?

報道出現在Firebug看似隨機的時刻。

當你可以完全確定承諾被拒絕沒有附加處理程序的時候是垃圾收集時。 IIRC,Firefox確實已經實現了這個鉤子,所以這些「隨機時刻」將取決於GC行爲。

+0

謝謝Bergi和Benjamin,現在用兩種瀏覽器都對我有意義。 –