DEV Community

Bukunmi Odugbesan
Bukunmi Odugbesan

Posted on

Coding Challenge Practice - Question 94

The task is to implement promise.any().

The boilerplate code

function any(promises) {
  // your code here
}
Enter fullscreen mode Exit fullscreen mode

Promise.any receives an array of promises and returns a single promise that resolves from the value of that promise.

return new Promise((resolve, reject) => {
})
Enter fullscreen mode Exit fullscreen mode

Store each rejection reason, track how many promises fulfilled and total number of promises.

const errors = [];
let rejectedCount = 0;
const total = promises.length;
Enter fullscreen mode Exit fullscreen mode

If there are no promises, reject

if (total === 0) {
      reject(new AggregateError([], 'All promises were rejected'));
      return;
    }
Enter fullscreen mode Exit fullscreen mode

Ensure promises work correctly

promises.forEach((promise, index) => {
      Promise.resolve(promise).then(
Enter fullscreen mode Exit fullscreen mode

As soon as one promise fulfills, resolve

 value => {
          resolve(value); // first fulfilled value wins
        },
Enter fullscreen mode Exit fullscreen mode

If all promises fail

error => {
          errors[index] = error;
          rejectedCount++;

          if (rejectedCount === total) {
            reject(new AggregateError(errors, 'All promises were rejected'));
          }
        }
Enter fullscreen mode Exit fullscreen mode

The final code

function any(promises) {
  // your code here
  return new Promise((resolve, reject) => {
    const errors = [];
    let rejectedCount = 0;
    const total = promises.length;

    if(total === 0) {
      reject(new AggregateError([], "All promises were rejected"));
      return;
    }

    promises.forEach((promise, index) => {
      Promise.resolve(promise).then(
        value => {
          resolve(value);
        }, 
        error => {
          errors[index] = error;
          rejectedCount++;

          if(rejectedCount === total) {
            reject(new AggregateError("All promises were rejected", errors))
          }
        }
      )
    })
  })
}
Enter fullscreen mode Exit fullscreen mode

That's all folks!

Top comments (0)