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():
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中文網其他相關文章!