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

「then(success, failed)」什麼時候是 Promise 的反模式?

DDD
DDD原創
2024-12-22 06:07:12594瀏覽

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

.then(success, failed) 什麼時候被視為 Promises 的反模式?

promise 中的 .then(success, failure) 語法可以被視為反模式在某些情況下。讓我們探討一下原因,並將其與 .then().catch() 方法進行比較。

控制流差異

.then(success, failed) 傳回一個如果回呼函數被拒絕的 Promise拋出錯誤。因此,如果成功記錄器失敗,錯誤將傳遞給後續的 .catch() 處理程序,而不是失敗回呼。

反模式場景

在以下場景中,使用.then( success、fail) 會出現問題:

some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })

如果success 日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄功能失敗,錯誤將日誌記錄不會被failed 捕獲回調,但由鏈中的下一個.catch() 處理程序執行。這可能會破壞預期的錯誤處理邏輯。

首選.then().catch()

相反,建議的方法是分別使用.then() 和.catch():

some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })

在這種情況下,.catch() 處理程序也會擷取成功日誌記錄函數拋出的任何錯誤。這確保以一致的方式處理所有錯誤。

異常處理意圖

雖然 .then().catch() 語法提供了更好的錯誤處理,但 .then(success, failed)反模式在您想要執行以下操作的情況下非常有用:

  • 專門處理給定的錯誤
  • 根據是否發生錯誤採取不同的操作。

但是,請務必記住,此模式會在控制流中引入分支,這可能並不理想在某些情況下。

替代選項

代替 .then(成功,失敗), .done() 或 .finally() 方法可用於一致地處理完成或錯誤。

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

// Handle completion always, regardless of errors
some_promise_call()
   .finally(function() {
       logger.log('Promise completed');
   });

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

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