首頁 >web前端 >js教程 >什麼時候使用「.then(success, failed)」作為 Promise 的反模式?

什麼時候使用「.then(success, failed)」作為 Promise 的反模式?

Barbara Streisand
Barbara Streisand原創
2024-12-25 22:15:13487瀏覽

When is Using `.then(success, fail)` an Antipattern for Promises?

.then(success, failure) 何時被視為 Promise 的反模式?

Bluebird 的 Promise 常見問題解答建議使用 .then(success, failure) 是一種反模式。這是因為 .then() 呼叫回傳一個承諾,如果回呼拋出錯誤,該承諾將被拒絕。因此,當 success logger 回調失敗時,錯誤將傳遞給以下 .catch() 回調,但不會傳遞給與 success 回呼一起提供的失敗回呼。

控制流程圖:

[有兩個參數的 then 的控制流程圖影像 then catch鏈]

同步等效:

// some_promise_call().then(logger.log, logger.log)
then: {
    try {
        var results = some_call();
    } catch(e) {
        logger.log(e);
        break then;
    } // else
        logger.log(results);
}

// some_promise_call().then(logger.log).catch(logger.log)
try {
    var results = some_call();
    logger.log(results);
} catch(e) {
    logger.log(e);
}

模式原理:

通常,錯誤會在每一步中被捕獲處理和錯誤處理是集中的,因此所有錯誤都由單一最終處理程序處理。然而,反模式中提到的模式在以下情況下很有用:

  • 需要在給定步驟中專門處理錯誤。
  • 如果沒有錯誤發生,後續操作將顯著不同。

此模式可以在控制中引入分支 flow.

推薦模式:

不要重複回調,請考慮使用.catch() 和.done():

some_promise_call()
   .catch(function(e) {
       return e; // it's OK, we'll just log it
   })
   .done(function(res) {
       logger.log(res);
   });

您也可以考慮使用 .finally().

以上是什麼時候使用「.then(success, failed)」作為 Promise 的反模式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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