亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么時候.then(成功,失敗)被認為是承諾的反模式?

什么時候.then(成功,失?。┍徽J為是承諾的反模式?

江戶川亂折騰 2019-05-27 16:20:02
什么時候.then(成功,失?。┍徽J為是承諾的反模式?我看了一下bluebird promise FAQ,其中提到了這.then(success, fail)是一個反模式。我不太了解它對try和catch的解釋。以下是什么問題?some_promise_call().then(function(res) { logger.log(res) }, function(err) { logger.log(err) })似乎這個例子建議以下是正確的方法。some_promise_call().then(function(res) { logger.log(res) }).catch(function(err) { logger.log(err) })有什么不同?
查看完整描述

4 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

有什么不同?

.then()調用將返回一個承諾,如果回調引發錯誤,將拒絕該承諾。這意味著,當您的成功logger失敗時,錯誤將傳遞給以下.catch()回調,但不會傳遞給fail與之并行的回調success。

這是一個控制流程圖

https://img1.sycdn.imooc.com//5ceb9e650001270b03000300.jpghttps://img1.sycdn.imooc.com//5ceb9e6500013a1a03000480.jpg

用同步代碼表達它:

// 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()它。


查看完整回答
反對 回復 2019-05-27
?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

兩者并不完全相同。不同之處在于第一個示例不會捕獲在success處理程序中拋出的異常。因此,如果您的方法應該只返回已解析的promise,通常就是這種情況,您需要一個尾隨catch處理程序(或另一個then帶有空success參數的處理程序)。當然,可能是你的then處理程序沒有做任何可能會失敗的事情,在這種情況下使用一個2參數then可能沒問題。

但是我相信你鏈接到的文本的重點then在于它能夠鏈接一堆異步步驟的回調非常有用,當你實際執行此操作時,2參數形式的then巧妙表現并不像預期的那樣,由于上述原因。使用中鏈時,它特別違反直覺。

作為一個做了很多復雜的異步事情并且碰到這樣的角落而不是我承認的人,我真的建議避免使用這種反模式并采用單獨的處理程序方法。


查看完整回答
反對 回復 2019-05-27
?
慕森王

TA貢獻1777條經驗 獲得超3個贊

通過觀察兩者的優點和缺點,我們可以對哪種情況做出適當的猜測。這是實施承諾的兩種主要方法。兩者都有它的優缺點

捕獲方法

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

好處

  1. 所有錯誤都由一個catch塊處理。

  2. 甚至在then塊中捕獲任何異常。

  3. 鏈接多個成功回調

缺點

  1. 在鏈接的情況下,變得難以顯示不同的錯誤消息。

成功/錯誤方法

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

好處

  1. 你得到了細粒度的錯誤控制。

  2. 您可以為各種類型的錯誤(如db error,500 error等)提供常見的錯誤處理功能。

Disavantages

  1. catch如果您希望處理成功回調引發的錯誤,您仍然需要另一個


查看完整回答
反對 回復 2019-05-27
?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

簡單解釋:

在ES2018中

使用參數onRejected調用catch方法時,將執行以下步驟:

  1. 讓我們承諾這個價值。

  2. 回來?調用(promise,“then”,“undefined,onRejected”)。

這意味著:

promise.then(f1).catch(f2)

等于

promise.then(f1).then(undefiend, f2)


查看完整回答
反對 回復 2019-05-27
  • 4 回答
  • 0 關注
  • 3440 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號