4 回答
TA貢獻1765條經驗 獲得超5個贊
有什么不同?
該.then()調用將返回一個承諾,如果回調引發錯誤,將拒絕該承諾。這意味著,當您的成功logger失敗時,錯誤將傳遞給以下.catch()回調,但不會傳遞給fail與之并行的回調success。
這是一個控制流程圖:


用同步代碼表達它:
// 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);}第二個log(就像第一個參數一樣.then())只會在沒有發生異常的情況下執行。標記的塊和break語句感覺有點奇怪,這實際上是python所具有try-except-else的(推薦閱讀?。?/p>
// some_promise_call().then(logger.log).catch(logger.log)try {
var results = some_call();
logger.log(results);} catch(e) {
logger.log(e);}該catch記錄儀也將處理來自成功記錄通話例外。
差異太大了。
我不太了解它對try和catch的解釋
通常,您希望在處理的每個步驟中捕獲錯誤,并且不應在鏈中使用它。期望您只有一個處理所有錯誤的最終處理程序 - 而當您使用“反模式”時,某些后續回調中的錯誤不會被處理。
但是,這種模式實際上非常有用:當您想要處理恰好在此步驟中發生的錯誤時,并且您希望在沒有錯誤發生時執行完全不同的操作 - 即錯誤無法恢復時。請注意,這是分支您的控制流程。當然,這有時是期望的。
以下是什么問題?
some_promise_call().then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
你不得不重復你的回調。你寧愿想要
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});你也可以考慮使用.finally()它。
TA貢獻1794條經驗 獲得超8個贊
兩者并不完全相同。不同之處在于第一個示例不會捕獲在success處理程序中拋出的異常。因此,如果您的方法應該只返回已解析的promise,通常就是這種情況,您需要一個尾隨catch處理程序(或另一個then帶有空success參數的處理程序)。當然,可能是你的then處理程序沒有做任何可能會失敗的事情,在這種情況下使用一個2參數then可能沒問題。
但是我相信你鏈接到的文本的重點then在于它能夠鏈接一堆異步步驟的回調非常有用,當你實際執行此操作時,2參數形式的then巧妙表現并不像預期的那樣,由于上述原因。使用中鏈時,它特別違反直覺。
作為一個做了很多復雜的異步事情并且碰到這樣的角落而不是我承認的人,我真的建議避免使用這種反模式并采用單獨的處理程序方法。
TA貢獻1777條經驗 獲得超3個贊
通過觀察兩者的優點和缺點,我們可以對哪種情況做出適當的猜測。這是實施承諾的兩種主要方法。兩者都有它的優缺點
捕獲方法
some_promise_call().then(function(res) { logger.log(res) }).catch(function(err) { logger.log(err) })好處
所有錯誤都由一個catch塊處理。
甚至在then塊中捕獲任何異常。
鏈接多個成功回調
缺點
在鏈接的情況下,變得難以顯示不同的錯誤消息。
成功/錯誤方法
some_promise_call().then(function success(res) { logger.log(res) },
function error(err) { logger.log(err) })好處
你得到了細粒度的錯誤控制。
您可以為各種類型的錯誤(如db error,500 error等)提供常見的錯誤處理功能。
Disavantages
catch如果您希望處理成功回調引發的錯誤,您仍然需要另一個
TA貢獻1848條經驗 獲得超2個贊
簡單解釋:
在ES2018中
使用參數onRejected調用catch方法時,將執行以下步驟:
讓我們承諾這個價值。
回來?調用(promise,“then”,“undefined,onRejected”)。
這意味著:
promise.then(f1).catch(f2)
等于
promise.then(f1).then(undefiend, f2)
添加回答
舉報
