Promise.all find which promise rejected

送分小仙女□ 提交于 2019-12-03 06:13:54

You can use an onreject handler on each promise:

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);
});

In general, every rejection reason should contain enough information to identify the issue that you need to handle (or log).

this wrapper will wait for and return every result and/or rejection

the returned array will be objects

{ // 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

One caveat: this will wait for ALL promises to resolve or reject, not reject as soon as the first rejection occurs

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);
        }
    });
});
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!