在我工作的公司裏,一切都是用回調完成的。我們正在開始編寫具有大代碼所依賴的承諾的小組件。我們開始遇到麻煩。如何用回調包裝承諾?
function getSomething() {
return Promise.resolve('hello')
}
function test(cb) {
getSomething()
.then(string => {
a.s
cb(null, string)
}, error => cb(error))
}
test((error, result) => {
console.log(error)
console.log(result)
a.s
})
這是一個簡單的問題示例。在這個代碼中,因爲a不存在,它會拋出一個警告UnhandledPromiseRejectionWarning並終止進程。控制檯日誌永遠不會到達。
背後的邏輯是,如果發生錯誤會觸發catch回調。
function test(cb) {
getSomething()
.then(string => {
// a.s
cb(null, string)
}, error => cb(error))
.catch(error => cb(error))
}
我被建議在承諾鏈的末尾使用顯式捕獲。問題是如果在回調中拋出一個錯誤,回調會觸發兩次。
感謝您的任何幫助。
如何整個包住再放入一試,並在catch錯誤? –
那麼..那麼可能你不應該在'then'階段使用'onRejected'回調,而只需鏈接一個'.catch()'就像你在第二個代碼段中做的那樣。 – Redu
@Redu,將此評論移至答案,因爲這是正確的答案。 @ AlvaroOrtiz的第二段代碼將錯誤處理程序'cb'連接兩次。 – DaveS