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