4 回答

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個贊
有什么不同?
該.then()
調(diào)用將返回一個承諾,如果回調(diào)引發(fā)錯誤,將拒絕該承諾。這意味著,當(dāng)您的成功logger
失敗時,錯誤將傳遞給以下.catch()
回調(diào),但不會傳遞給fail
與之并行的回調(diào)success
。
這是一個控制流程圖:
用同步代碼表達(dá)它:
// 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
(就像第一個參數(shù)一樣.then()
)只會在沒有發(fā)生異常的情況下執(zhí)行。標(biāo)記的塊和break
語句感覺有點(diǎn)奇怪,這實(shí)際上是python所具有try-except-else
的(推薦閱讀!)。
// 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的解釋
通常,您希望在處理的每個步驟中捕獲錯誤,并且不應(yīng)在鏈中使用它。期望您只有一個處理所有錯誤的最終處理程序 - 而當(dāng)您使用“反模式”時,某些后續(xù)回調(diào)中的錯誤不會被處理。
但是,這種模式實(shí)際上非常有用:當(dāng)您想要處理恰好在此步驟中發(fā)生的錯誤時,并且您希望在沒有錯誤發(fā)生時執(zhí)行完全不同的操作 - 即錯誤無法恢復(fù)時。請注意,這是分支您的控制流程。當(dāng)然,這有時是期望的。
以下是什么問題?
some_promise_call().then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
你不得不重復(fù)你的回調(diào)。你寧愿想要
some_promise_call() .catch(function(e) { return e; // it's OK, we'll just log it }) .done(function(res) { logger.log(res); });
你也可以考慮使用.finally()
它。

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個贊
兩者并不完全相同。不同之處在于第一個示例不會捕獲在success
處理程序中拋出的異常。因此,如果您的方法應(yīng)該只返回已解析的promise,通常就是這種情況,您需要一個尾隨catch
處理程序(或另一個then
帶有空success
參數(shù)的處理程序)。當(dāng)然,可能是你的then
處理程序沒有做任何可能會失敗的事情,在這種情況下使用一個2參數(shù)then
可能沒問題。
但是我相信你鏈接到的文本的重點(diǎn)then
在于它能夠鏈接一堆異步步驟的回調(diào)非常有用,當(dāng)你實(shí)際執(zhí)行此操作時,2參數(shù)形式的then
巧妙表現(xiàn)并不像預(yù)期的那樣,由于上述原因。使用中鏈時,它特別違反直覺。
作為一個做了很多復(fù)雜的異步事情并且碰到這樣的角落而不是我承認(rèn)的人,我真的建議避免使用這種反模式并采用單獨(dú)的處理程序方法。

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個贊
通過觀察兩者的優(yōu)點(diǎn)和缺點(diǎn),我們可以對哪種情況做出適當(dāng)?shù)牟聹y。這是實(shí)施承諾的兩種主要方法。兩者都有它的優(yōu)缺點(diǎn)
捕獲方法
some_promise_call().then(function(res) { logger.log(res) }).catch(function(err) { logger.log(err) })
好處
所有錯誤都由一個catch塊處理。
甚至在then塊中捕獲任何異常。
鏈接多個成功回調(diào)
缺點(diǎn)
在鏈接的情況下,變得難以顯示不同的錯誤消息。
成功/錯誤方法
some_promise_call().then(function success(res) { logger.log(res) }, function error(err) { logger.log(err) })
好處
你得到了細(xì)粒度的錯誤控制。
您可以為各種類型的錯誤(如db error,500 error等)提供常見的錯誤處理功能。
Disavantages
catch
如果您希望處理成功回調(diào)引發(fā)的錯誤,您仍然需要另一個

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個贊
簡單解釋:
在ES2018中
使用參數(shù)onRejected調(diào)用catch方法時,將執(zhí)行以下步驟:
讓我們承諾這個價值。
回來?調(diào)用(promise,“then”,“undefined,onRejected”)。
這意味著:
promise.then(f1).catch(f2)
等于
promise.then(f1).then(undefiend, f2)
添加回答
舉報