3

我有以下代碼。 它沒有拋出未處理的拒絕錯誤而按預期工作。現在未處理的拒絕錯誤Bluebird

p = new Promise (fulfill, reject) -> 
    reject new Error 'some error' 

p.catch (error) -> 
    console.log error 

,第二代碼例則會引發一個未處理的拒絕錯誤。 有人可以向我解釋爲什麼在我明確處理錯誤時發生這種情況。

p = new Promise (fulfill, reject) -> 
    reject new Error 'some error' 

p.then -> 
    console.log 'ok' 

p.catch (error) -> 
    console.log error 

順便說一句。我測試的鉻和藍鳥v3.4.7

+0

那是CoffeeScript的更多信息?也許添加coffeescript標籤? – dtkaias

+0

是它的咖啡文本。只是添加了標籤。 –

回答

1

error management configuration如果註冊當一個承諾被拒絕沒有catch處理藍鳥拋出一個錯誤,而無需等待,看看一個在將來添加。請注意,檢查拒絕處理程序應該與設置承諾鏈的線程異步完成。正如他們所說,「一些編程模式會導致誤報」。對真的?另一方面,未捕獲到的異常錯誤不是ES6標準的一部分,並且實現以不同方式處理它們:Firefox等待或等待,直到GC時間,而Chrome超時(或用於超時) 「可能未被捕獲的承諾拒絕」錯誤。

請參閱藍鳥文檔,瞭解藍鳥可能的解決方案,承諾在附加處理程序之前發生錯誤。


但由於這兩個例子中同步附加拒絕處理程序,承諾p,對異常的原因似乎在於別處。

感謝@DJ的回答,但有不同的解釋。在第二個例子中,then返回承諾,如果p被拒絕,並且沒有拒絕處理程序,則承諾被拒絕。由.then返回的承諾很可能是拋出錯誤的那個。

+0

但是,這個答案並不能解釋問題中兩個單獨的代碼塊之間的區別,因爲當承諾被拒絕時,兩個代碼塊都沒有安裝catch處理程序。 – jfriend00

+0

@ jfriend00我同意答案的第一部分沒有解釋這個錯誤。我已經澄清了第二部分。 – traktor53

1

當您連鎖承諾,每個鏈被視爲承諾的新實例。

catch()then()類似,只是您在拒絕情況下只提供處理程序。

因此,在您的示例1中:您的catch()用於處理拒絕創建錯誤時的原始承諾。

在示例2:它是說,當第一個承諾是解決時,請繼續前進到第二個承諾,然後提供處理器成功和失敗。該catch(),你有沒有在功能處理錯誤的then(),而不是一個由第一承諾

提出內見https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch的漁獲是如何工作的

+0

但是,如果你運行代碼,你會發現錯誤被記錄到控制檯aswel作爲未處理的拒絕錯誤。所以'catch()'在第一個promise中處理錯誤。這不是很奇怪嗎?如果藍鳥告訴我錯誤未處理,爲什麼仍然執行catch。 –

相關問題