第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

江戶川亂折騰 2019-05-27 16:20:02
什么時候.then(成功,失敗)被認(rèn)為是承諾的反模式?我看了一下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貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個贊

有什么不同?

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

這是一個控制流程圖

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

用同步代碼表達(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()它。


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

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ú)的處理程序方法。


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

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) })

好處

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

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

  3. 鏈接多個成功回調(diào)

缺點(diǎn)

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

成功/錯誤方法

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

好處

  1. 你得到了細(xì)粒度的錯誤控制。

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

Disavantages

  1. catch如果您希望處理成功回調(diào)引發(fā)的錯誤,您仍然需要另一個


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

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個贊

簡單解釋:

在ES2018中

使用參數(shù)onRejected調(diào)用catch方法時,將執(zhí)行以下步驟:

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

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

這意味著:

promise.then(f1).catch(f2)

等于

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


查看完整回答
反對 回復(fù) 2019-05-27
  • 4 回答
  • 0 關(guān)注
  • 3413 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號