簡體   English   中英

未處理的拒絕錯誤Bluebird

[英]Unhandled rejection error 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

順便說一句。 我正在測試chrome和bluebird v3.4.7

每個錯誤管理配置如果在拒絕承諾時沒有注冊 catch處理程序,Bluebird會拋出錯誤,而不必等待將來是否添加了一個。 請注意,檢查拒絕處理程序應該與設置promise鏈的線程異步完成。 正如他們所說,“一些編程模式會導致誤報”。 對真的?

另一方面,未捕獲的異常錯誤不是ES6標准的一部分,並且實現以不同的方式處理它們:Firefox等待或等待,直到GC時間,而Chrome超時(或曾經超時)“可能未被捕獲承諾拒絕“錯誤。

有關Bluebird promises的可能解決方案,請參閱Blue bird文檔,以便在附加處理程序之前出錯。


但由於兩個示例同步附加了promise p的拒絕處理程序,因此異常的原因似乎在其他地方。

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

鏈接Promises時 ,每個鏈都被視為Promise的新實例。

catch()類似於then()除了你只在拒絕情況下提供處理程序。

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

在示例2中:它說,當第一個承諾得到解決時,請轉到第二承諾,然后提供成功和失敗的處理程序。 你在那里的catch()用於處理then()函數的錯誤,而不是第一個Promise引發的錯誤

有關catch如何工作的更多信息,請參閱https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM