首頁 >web前端 >js教程 >為什麼連鎖承諾有時會忽略拒絕?

為什麼連鎖承諾有時會忽略拒絕?

Barbara Streisand
Barbara Streisand原創
2024-12-12 15:56:10434瀏覽

Why Do Chained Promises Sometimes Ignore Rejections?

鍊式 Promise 不會傳遞拒絕

儘管它們有意依賴先前的 Promise,但鍊式 Promise 可能無法傳播錯誤。這種行為可能令人費解,但植根於 Promises/A 的本質。

誤解:鏈依賴

誤解是每個然後都意味著對前一個的依賴承諾的成功解決。然而事實並非如此。

Promise Chaining

在 Promise Chaining 中,then 中回呼函數的結果成為後續 Promise 的解析。因此:

  • 如果回調回傳一個promise,則新的promise被同化到鏈中。
  • 如果回呼不回傳promise或傳回undefined,則直接將它的值傳遞到下一個 Promise 的回呼。

處理拒絕

then 回呼中拋出或拒絕的承諾會觸發下一個承諾的 catch 或錯誤回調。但是,如果在回調中處理錯誤,則鏈將繼續執行,就像承諾已成功解決一樣。

範例:

考慮以下程式碼:

let promise1 = Promise.resolve(42);
let promise2 = promise1.then(
  (value) => value * 2,
  (err) => {
    console.error('Error in promise1:', err);
    // Handle the error (e.g., return a new promise)
  }
);
promise2.then((value) => console.log('Value from promise2:', value));

在此範例中,如果Promise1 被拒絕,則其錯誤處理程序會記錄錯誤,然後傳回預設值。這允許promise2繼續進行,就像它已收到來自promise1的成功回應一樣。

資料庫更新的應用程式

在您的資料庫更新範例中,db.query中的錯誤將在其 then 回調中處理,並提供預設值。這允許後續的 then 回調繼續進行並仍然執行資料庫更新,即使 db.query 失敗。

最佳實踐

為了確保一致的錯誤處理,請考慮以下最佳實踐:

  • 使用帶有catch 或try -catch 的明確錯誤處理來處理拒絕一致。
  • 從錯誤處理程序中重新拋出或傳回被拒絕的 Promise,以避免錯誤沿著鏈傳播並確保正確處理。
  • 使用 Promise.all() 聚合來自多個 Promise 的錯誤並進行處理它們集中在一個地方。

以上是為什麼連鎖承諾有時會忽略拒絕?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn