2017-05-06 83 views
1

我想在可能會失敗的情況下運行幾個承諾。在一個失敗的情況下,我怎麼知道哪一個失敗了,仍然能夠訪問沒有失敗的promise的結果?如何在promise.all中訪問已解析的承諾es6

現在,我使用Promise.all,但如果任何承諾的失敗,Promise.all自動進入catch錯誤塊,所以我無法從我的.then塊訪問什麼,所以我不能訪問任何成功的承諾結果。有人可以幫忙嗎?

我的小提琴:https://jsfiddle.net/9u2nL7zj/

我的代碼:

let promise1 = new Promise((resolve, reject) => { 
    console.log('-uno-') 
    resolve('-promise 1 success') 
}) 

let promise2 = new Promise((resolve, reject) => { 
    console.log('-dos-') 
    reject('-promise 2 fail') 
}) 

let promise3 = new Promise((resolve, reject) => { 
    console.log('-tres-') 
    reject('-promise 3 fail') 
}) 


let promise4 = new Promise((resolve, reject) => { 
    setTimeout(() => { 
    console.log('-cuatro-') 
    resolve('-promise 4 success-') 
    }, 3000) 
}) 


Promise.all([promise1, promise2, promise3, promise4]).then((res) => { 
    console.log('--done--', res) 
}).catch((err) => { 
    console.log('--err--', err) 
}) 
+1

如果我理解正確,你想訪問所有已解決Promise的結果,即使有一個失敗的結果(包括那些失敗後可能解決的結果,否則它會很複雜) - 所以基本上你想要等待所有,對吧?對我來說,這聽起來非常像[那個問題](http://stackoverflow.com/q/31424561/6730571)。 'Promise.all'意味着所有人都必須解決。你想要的是類似[Q](https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled)的Promise.allSettled,但這不是標準的,它是一個庫。 –

回答

0

它似乎並不像Promise.all是去了解這個問題的最好辦法。從MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all):

如果有任何傳入的承諾拒絕,Promise.all立即與拒絕,對方承諾是否已經解決了這個承諾的價值拒絕。

So Promise.all()適用於您需要每一個承諾來解決的情況。是否有理由需要他們全部一起解決。如果沒有,最好是給每個承諾它是自己的.then()和.catch()塊。