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