I am looking for something similar to Promise.all
that will continue to resolve promises concurrently even in the event that one or more of the promises reject
I have succeeded in using
Promise.all
together with only ever resolving thefetchRequest
promises
That's basically the way to go. ES6 does not have a helper function like allSettled (Q) or settle (Bluebird 2.x) for this case, so we will need to use Promise.all similar to like you did. Bluebird even has a dedicated .reflect() utility for this.
You would however not resolve them with undefined
in the case of a rejection, but rather with some useful value that allows to identify the errors.
function promiseRequests(requests) {
return Promise.all(requests.map(request => {
return fetch(request).then(res => {
return {value:res};
}, err => {
return {reason:err};
});
}));
}
You are essentially asking for a way to swallow any errors. As such, a function like this will be your best bet:
function swallow(p) {
// transforms rejected promises into promises fulfilled with undefined
return p.catch(function () { });
}
You would use it as follows:
Promise.all([swallow(fetch('url1.com')), swallow(fetch('url2.com'))]).then(function (data) {
console.log('All requests finished', data); //data could be ['resultXML', undefined]
});
or even
const promises = ['url1.com', 'url2.com'].map(fetch).map(swallow);
Promise.all(promises).then(function (data) {
// ...
});