Сегодня мы попытаемся увидеть, как реализованы некоторые из часто используемых статических методов обещаний javascript:

Promise.all () - этот метод возвращает одно обещание, которое выполняется , когда все обещания, переданные как итерируемые, выполнены или отклоняются с причина первого отклоненного обещания.

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise(function(resolve, reject) {     setTimeout(resolve, 100, ‘foo’);
});
Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log(values);
});
// expected output: Array [3, 42, “foo”]

Возможная реализация: -

Promise.allSettled () - этот метод возвращает обещание, которое разрешается после того, как все заданные обещания были разрешены или отклонены, с массивом объекты, каждый из которых описывает результат каждого обещания.

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => 
  setTimeout(reject, 100, ‘foo’)
); 
const promises = [promise1, promise2];
Promise.allSettled(promises).then((results) => results.forEach((result) => console.log(result.status)));
// expected output: 
// “fulfilled”
// “rejected”

Возможная реализация: -

Promise.race () - этот метод возвращает обещание, которое выполняется или отклоняется, как только одно из обещаний в итерируемом объекте выполняется или отклоняется со значением или причиной из этого обещать.

const promise1 = new Promise(function (resolve, reject) {
  setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise(function (resolve, reject) {
  setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then(function (value) {
  console.log(value);
  // Both resolve, but promise2 is faster
});
// expected output: "two"

Возможная реализация: -

Promise.any () * - этот метод принимает итерацию объектов Promise и, как только одно из обещаний в итерации выполняется, возвращает одно обещание, которое разрешается с помощью ценность этого обещания. Если в повторяемом обещании не выполнено ни одного обещания (если все данные обещания отклонены), то возвращенное обещание отклоняется с объектом, который все еще обсуждается: либо массив причин отклонения, либо AggregateError, новый подкласс Error, который группирует отдельные ошибки.

По сути, этот метод противоположен Promise.all ().

Примечание. - Метод Promise.any () является экспериментальным и не полностью поддерживается всеми браузерами. В настоящее время он находится на этапе кандидата в TC39 (этап 3).

const promise1 = new Promise(function (resolve, reject) {
  setTimeout(reject, 500, 'one');
});
const promise2 = new Promise(function (resolve, reject) {
  setTimeout(resolve, 100, 'two');
});
const promise3 = new Promise(function (resolve, reject) {
  setTimeout(resolve, 800, 'three');
});
promiseAny([promise1, promise2, promise3]).then(function (value) {
  console.log("value ", value);
}).catch(function (error) {
  console.log("error ", error);
});
// output - value two
// as promise2 resolves first

Возможная реализация: -

const promise1 = new Promise(function (resolve, reject) {
  setTimeout(reject, 500, 'one');
});
const promise2 = new Promise(function (resolve, reject) {
  setTimeout(reject, 100, 'two');
});
const promise3 = new Promise(function (resolve, reject) {
  setTimeout(reject, 800, 'three');
});
promiseAny([promise1, promise2, promise3]).then(function (value) {
  console.log("value ", value);
}).catch(function (error) {
  console.log("error ", error);
});
// output - error ["one", "two", "three"]
// as all promises rejects, returns an array of all errors

Удачного кодирования 👍