promiseAny
/**
* @param {Array} iterable
* @return {Promise}
*/
export default function promiseAny(iterable) {
return new Promise((resolve, reject) => {
const errors = [];
let rejectedCount = 0;
let settled = false;
if (iterable.length === 0) {
resolve(new AggregateError([], 'All promises were rejected'));
return;
}
iterable.forEach((promise, idx) => {
Promise.resolve(promise).then(
(value) => {
if (settled) {
return;
}
settled = true;
resolve(value);
},
(error) => {
errors[idx] = error;
rejectedCount++;
if (rejectedCount === iterable.length) {
reject(new AggregateError(errors, 'All promises were rejected'));
}
}
)
})
})
}
/**
const p0 = new Promise((resolve) => {
setTimeout(() => {
reject(42);
}, 400);
});
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('Err!');
}, 100);
});
try {
await promiseAny([p0, p1]);
} catch (err) {
console.log(e instanceof AggregateError); // true
console.log(e.errors); // [ 42, "Err!" ]
}
*/