2015-10-14 91 views
0

我對將承諾中的錯誤傳遞給catch處理程序時有點困惑。返回承諾並發現錯誤

使用下面的代碼位,如果promise2導致錯誤,是否傳遞給底部的catch?另外,我的回報在第一個「那麼」作爲承諾返回promise2,還是返回doc

promise1(foo).then(doc =>{ 
    return promise2(doc).then(doc => { 
    return doc 
    }) 
}).then(doc =>{ 
    console.log(doc) 
}).catch(err => { 
    console.error(err) 
}) 

乾杯

回答

0

一個then可以返回一個承諾,但如果事情失敗,你需要明確地返回拒絕。在下面changedDoc的例子中被傳遞給第二then作爲newDoc

promise1(foo).then(doc =>{ 
    // changedDoc = doc..... 
    if (good things happened) { 
    return changedDoc; 
    } else { 
    return new Promise.reject("error"); 
    } 
}).then(newdoc =>{ 
    console.log(newdoc) 
}).catch(err => { 
    console.error(err) 
}) 
+2

'明確地返回reject'或'throw'錯誤 –

+0

是的......但承諾它的點用自己的一元結構,以避免需要爲'throw' –

0

then可以接收兩個參數:

  • 一個用於當許滿足
  • 其他的情況下的情況下,當承諾被拒絕(故意或因爲拋出異常)

如果在執行t時出現錯誤他在完全填充或拒絕的代碼中執行將繼續在下一個被拒絕的回調中執行。在您的代碼中,第一個被拒絕的回調是catch回調中指定的回調。如果該塊不存在,則該異常將繼續冒泡至代碼中的第一個catch塊。並且,如果沒有這樣的塊,將它由瀏覽器處理,並顯示爲一個錯誤給用戶。

如果look at the documentation,你會看到catch就像只接收第二個參數then

Promise.prototype.then(onFulfilled, onRejected) 

Promise.prototype.catch(onRejected) 

你也可以看看this documentation on handling exceptions with promises

承諾的整個想法是能夠鏈接,以便成功傳播到onFullfilled回調,它可以運行沒有錯誤,並返回一些處理程序,或錯誤運行,將與由下一個onRejected處理。錯誤可能是有目的的拒絕或未處理的異常。