2016-11-30 32 views
0

我建立一個同步的一系列承諾的,像這樣:如何捕捉錯誤在同步諾言鏈

let order = [fn1, fn2, fn3]; 
let result = Promise.resolve(); 
order.reduce((chain, task) => { 
    return chain.then(task); 
}, result); 

(通過的this article節「系列中的執行承諾」)。這可以像我期望的那樣運行所有的系列操作,但在捕捉錯誤/將catch塊放在哪裏時會遇到問題。

+3

邊注:異步即使解決,捆綁,像這樣的承諾執行。 –

+2

有一些想法:這些並不是真正同步的,它們是連續的(所有的承諾都是異步的,總是......聽起來像步行,但如果你在外界改變狀態,這將會產生巨大的影響)。如果您想要獨立處理錯誤情況(基於將順序中的下一個調用的失敗轉換爲成功),那麼您需要更改數據格式,或者您需要接受任何可能失敗的消息,並允許消費者發現錯誤;最後,如果你不保存對方出現的承諾,那麼你就不能傳遞它。 – Norguard

回答

3

趕上只需把它放在最後,在那裏你通常會繼續連鎖店:

[fn1, fn2, fn3].reduce((chain, task) => { 
    return chain.then(task); 
}, Promise.resolve()).catch(err => { 
    console.error(err); 
}); 

記住reduce擴展到

Promise.resolve().then(fn1).then(fn2).then(fn3).catch(err => { 
    console.error(err); 
}); 
0

你不一定需要一個catch塊。 reduce將返回鏈中第一個被拒絕的承諾。看到這一點,寫出什麼reduce實際上會產生:

const resolve =() => Promise.resolve(), reject =() => Promise.reject(); 
const promises = [resolve, reject, resolve]; 

const result = Promise.resolve() 
    .then(resolve).then(reject).then(resolve); 

第一then處理程序將被調用,導致履行諾言,所以接下來then處理程序將被調用,此時導致拒絕承諾,因此最終then不會調用它的處理程序,將「穿越」被拒絕的承諾,這將成爲整個表達式的結果,並且可以用

result.catch(() => alert("Hey Mom, one of the chained promises rejected"))