Promise.any()

Метод Promise.any() принимает итерируемый объект содержащий объекты промисов Promise. Как только один из промисов (Promise) выполнится успешно (fullfill), метод возвратит единственный объект Promise со значением выполненного промиса. Если ни один из промисов не завершится успешно (если все промисы завершатся с ошибкой, т.е. rejected), тогда возвращённый объект Promise будет отклонён (rejected) с одним из значений: массив содержащий причины ошибки (отклонения), или AggregateError — подкласс Error, который объединяет выброшенные ошибки вместе. По существу, метод Promise.any() является противоположностью для Promise.all().

Warning! The Promise.any() method is experimental and not fully supported by all browsers. It is currently in the TC39 Candidate stage (Stage 3).

Синтаксис

Promise.any(iterable);

Параметры

iterable
Итерируемый(iterable) объект, например Array.

Возвращаемое значение

  • Исполненный Promise, если переданный итерируемый объект пуст.
  • Исполненный асинхронно Promise, если переданный итерируемый объект не содержит промисов.
  • Во всех других случаях Promise со статусом ожидания(pending). Возвращённый промис будет исполнен(resolved/rejected) асинхронно (как только стэк вызовов окажется пустым), когда один (любой) промис из  переданного итерируемого объекта исполнится, либо все промисы будут отклонены.

Описание

Метод полезен, когда нужно вернуть первый исполненный промис. После того как один из промисов будет исполнен, метод не будет дожидаться исполнения остальных. В отличие от Promise.all(), который содержит массив(Array) значений исполненных промисов, Promise.any() содержит только одно значение (при условии, что хотя бы один из промисов исполнен успешно). Такой подход может быть выгодным, когда нужно, чтобы выполнился только один промис, неважно какой. Также, в отличие от Promise.race(), который возвращает промис, содержащий значение первого завершённого(resolved или rejected), этот метод возвращает промис содержащее значение первого успешно выполненного(resolved) промиса. Метод будет игнорировать исполнение промисов с ошибкой(rejection) вплоть до первого исполненного успешно (fullfilment).

Успешное исполнение(Fullfilment)

Если один из промисов исполнится успешно, возвращённый промис асинхронно исполнится успешно со значением выполненного промиса, независимо от завершения остальных промисов.

  • Если передан пустой итерируемый объект, тогда метод возвращает (синхронно) выполненный промис.
  • Если один из переданных промисов исполнится успешно, или в переданном итерируемом объекте не содержится промисов, промис возвращённый из метода Promise.any асинхронно исполнится успешно.

Исполнение с ошибкой(Rejection)

Если все переданные промисы будут отклонены (rejected), Promise.any асинхронно будет отклонено в одном из двух вариантов (которые ещё не были согласованы): либо

  • Массив(Array) содержащий причины отклонения всех промисов переданных в итерируемом объекте, либо
  • Объект AggregateError, расширяющий Error, который содержит указатель на массив(Array) исключений.

Спецификации

Specification
ESNext Promise.any Proposal

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также