在 Bluebird Promise 常見問題中,.then(success, failed) 被標記為反模式。這可能會令人困惑,特別是如果您不理解有關 try 和 catch 語句的解釋。
.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); }
將其與:
// some_promise_call().then(logger.log).catch(logger.log) try { var results = some_call(); logger.log(results); } catch(e) { logger.log(e); }
在此進行比較在這種情況下,catch 記錄器會處理成功記錄器呼叫中的異常。
反對此模式的論點是,您通常應該在以下位置捕獲錯誤:每個處理步驟並避免連鎖使用。我們期望您只有一個最終處理程序來處理所有錯誤。
但是,在處理特定步驟中的特定錯誤並在沒有錯誤發生時採取不同的操作時,此模式很有用。請注意,這會分支您的控制流。
考慮以下內容:
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中文網其他相關文章!