Сегодня мы попытаемся увидеть, как реализованы некоторые из часто используемых статических методов обещаний 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
Удачного кодирования 👍