JSFiddle - React, Tailwind, and code Playground
by brigand
JavaScript
function range(min, max) {
return Array.from({ length: max - min }, (_, i) => i + min);
}
// my solution
function myPromise_all(promises) {
return new Promise((resolve, reject) => {
// to hold results from each promise
const results = new Map();
function maybeResolve() {
if (results.size == promises.length) {
const list = range(0, results.size)
.map(index => results.get(index));
resolve(list);
}
}
maybeResolve();
// loop over the array of promises
promises.forEach((prom, i) => {
// on success/resolve add value of promise to corresponding index
// in results array. If results array as grown to equal length of
// given promises array resolve
prom.then(
value => {
results.set(i, value);
maybeResolve();
},
// on failure/rejection of any promise return a rejected promise
reject
);
});
});
}
// Test code.
myPromise_all([]).then(array => {
console.log("This should be []:", array);
});
function soon(val) {
return new Promise(resolve => {
setTimeout(() => resolve(val), Math.random() * 500);
});
}
myPromise_all([soon(1), soon(2), soon(3)]).then(array => {
console.log("This should be [1, 2, 3]:", array);
});
myPromise_all([soon(1), Promise.reject("X"), soon(3)])
.then(array => {
console.log("We should not get here");
})
.catch(error => {
if (error != "X") {
console.log("Unexpected failure:", error);
}
});