Promise.all找到被拒绝的承诺

时间:2017-02-02 17:09:27

标签: javascript promise es6-promise

在我的代码中,我使用Promise.all()在一些承诺全部完成后异步运行代码。有时,一个承诺会失败,我不知道为什么。 我想知道哪个承诺失败。将回调作为第二个参数传递给.then方法并没有多大帮助,因为我知道 承诺拒绝但不是哪个承诺拒绝。

堆栈跟踪也没有帮助,因为第一项是Promise.all()的错误处理程序。传递给传递给Error的{​​{1}}函数的第二个函数的第一个参数的try对象的行号只是我记录行号的行号

有人知道找出哪个承诺拒绝的方法吗?

2 个答案:

答案 0 :(得分:15)

您可以在每个承诺上使用onreject处理程序:

Promise.all(promises.map((promise, i) =>
    promise.catch(err => {
        err.index = i;
        throw err;
    });
)).then(results => {
    console.log("everything worked fine, I got ", results);
}, err => {
    console.error("promise No "+err.index+" failed with ", err);
});

通常,每个拒绝原因都应包含足够的信息来识别您需要处理(或记录)的问题。

答案 1 :(得分:2)

这个包装器将等待并返回每个结果和/或拒绝

返回的数组将是对象

{ // this one resolved
    ok: true,
    value: 'original resolved value'
},
{ // this one rejected
    ok: false,
    error: 'original rejected value'
},
{ // this one resolved
    ok: true,
    value: 'original resolved value'
},
// etc etc

一个警告:这将等待所有承诺解决或拒绝,而不是在第一次拒绝发生后立即拒绝

let allresults = function(arr) {
    return Promise.all(arr.map(item => (typeof item.then == 'function' ? item.then : Promsie.resolve(item))(value => ({value, ok:true}), error => ({error, ok:false}))));
}

allresults(arrayOfPromises)
.then(results => {
    results.forEach(result => {
        if(result.ok) {
            //good
            doThingsWith(result.value);
        } else {
            // bad
            reportError(result.error);
        }
    });
});