首頁 >web前端 >js教程 >什麼時候使用 `.then(success, failure)` 是 Promise 中的反模式?

什麼時候使用 `.then(success, failure)` 是 Promise 中的反模式?

Patricia Arquette
Patricia Arquette原創
2024-12-28 18:36:13842瀏覽

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

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

在 Bluebird Promise 常見問題中,.then(success, failed) 被標記為反模式。這可能會令人困惑,特別是如果您不理解有關 try 和 catch 語句的解釋。

.then(success, failed) 有什麼問題?

.then() 呼叫如果回調拋出錯誤,則傳回一個拒絕的承諾。這意味著如果成功記錄器失敗,錯誤將傳遞給以下 .catch() 回調,而不是伴隨成功的失敗回呼。

控制流程圖

.then 的控制流程有兩個參數和 .then-catch 鏈如下所示:

[.then 和 .then-catch的控制流程圖的圖像chain]

同步程式碼等效

用同步程式碼表達這一點:

// 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);
}

.then(success) 與.then() .catch()

將其與:

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

在此進行比較在這種情況下,catch 記錄器會處理成功記錄器呼叫中的異常。

.then(success, failure) 何時是反模式?

反對此模式的論點是,您通常應該在以下位置捕獲錯誤:每個處理步驟並避免連鎖使用。我們期望您只有一個最終處理程序來處理所有錯誤。

但是,在處理特定步驟中的特定錯誤並在沒有錯誤發生時採取不同的操作時,此模式很有用。請注意,這會分支您的控制流。

改進的反模式範例

考慮以下內容:

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, failure)` 是 Promise 中的反模式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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