# More promise API

##### Promise.all

This API will allow us to take in an iterable, an array of promises and return a new promise.

That returned promise will only be resolved when all listed promises are resolved, the array of their results will become the result of this returned promise.

If any of the promises is rejected, the promise returned by `Promise.all` immediately rejects with that error

```javascript
let promise = Promise.all(iterable);

// Example
Promise.all([
  new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
  new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2
  new Promise(resolve => setTimeout(() => resolve(3), 1000))  // 3
]).then(console.log);
```

##### Promise.allSettled

A less stricter version of `Promise.all`, it waits for all promises to settle, and regardless of the result.

```javascript
let urls = [
  'https://api.github.com/users/iliakan',
  'https://api.github.com/users/remy',
  'https://no-such-url'
];

Promise.allSettled(urls.map(url => fetch(url)))
  .then(results => { // (*)
    results.forEach((result, num) => {
      if (result.status == "fulfilled") {
        alert(`${urls[num]}: ${result.value.status}`);
      }
      if (result.status == "rejected") {
        alert(`${urls[num]}: ${result.reason}`);
      }
    });
  });
```

##### Promise.race

Similar to `Promise.all` but waits only for the first settled promise and get its result or error

The first promise that is resolved will become the value.

##### Promise.any

Similar to `Promise.any` but waits for the first fulfilled promise. If all of the promises are rejected then the returned promise is rejected with `Aggregateerror` with all the promise error in its `errors` property.