До этого момента мы узнали

  1. Почему были введены обещания?
  2. Основы обещания. Как создать и использовать обещание?
  3. Цепочка обещаний

Теперь мы рассмотрим некоторые другие методы в Promise API и когда их использовать.

Promise.all

Метод Promise.all() принимает на вход итерацию обещаний и возвращает единственный Promise

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

Если какой-либо из входных обещаний отклонить или выдает ошибку, возвращенное обещание будет немедленно отклонено с этой ошибкой / сообщением.

В приведенном выше примере в метод Promise.all переданы 3 переменных.

  1. Обещание, которое разрешится немедленно со значением 3
  2. Это не обещание. это означает, что мы также можем передавать в метод Promise.all значения, не являющиеся обещаниями.
  3. Обещание, которое разрешится через 1 секунду со значением foo.

Если вы выполните приведенный выше код, вы получите ответ — [3, 42, "foo"] через 1 секунду.

Почему 1 секунда?

Потому что Promise.all разрешится только после того, как разрешатся все входные обещания. Здесь третье обещание (с использованием setTimeout) выполняется за 1 секунду. И это последнее выполненное обещание. Итак, Promise.all разрешается через 1 с.

Как вы можете понять из примера, ответ представляет собой массив результатов входных обещаний.

Promise.all используется, когда у вас есть несколько асинхронных операций, которые необходимо выполнять параллельно, и после завершения ВСЕ из этих операций вы хотите выполнить некоторые операции.

Promise.any

Promise.any можно рассматривать как функциональную противоположность Promise.all.

Это тоже принимает на вход итерацию обещаний и возвращает один Promise

Возвращенное обещание разрешится, как только одно из входных обещаний выполнится (разрешится).

Возвращенное обещание НЕ БУДЕТ ОТКЛОНЯТЬ, если какое-либо из введенных обещаний отклоняется.

Однако, если ни одно из входных обещаний не разрешается, возвращенное обещание будет отклонено с AggregateError

В этом примере у нас есть 3 обещания

  1. Обещание, которое будет немедленно отклонено со значением 3
  2. Обещание, которое разрешится через 2 секунды со значением "resolved second"
  3. Обещание, которое разрешится через 1 секунду со значением "resolved first"

Когда вы выполняете приведенный выше код, вы получите результат «resolved first» через 1 секунду (первое разрешенное обещание), даже если первое входное обещание отклоняется немедленно.

Promise.any используется, когда у вас есть несколько асинхронных операций, которые необходимо запускать параллельно, и вам нужно выполнить некоторую операцию, когда ЛЮБОЕ входное обещание разрешится, независимо от статус других входных обещаний.

Promise.race

Promise.race аналогичен Promise.any.

В отличие от Promise.any, который ожидает разрешения любого входного обещания, этот метод resolves/rejects, как только одно из входных обещаний разрешается / отклоняется.

Гонка обещаний, если хотите, где победитель тот, кто первым решит / отвергнет.

Как вы можете понять из примера, на выходе будет - second Promise, поскольку оно выполняется быстрее, чем первое обещание.

Измените resolve на reject во втором обещании, и блок catch будет выполняться.

Promise.race используется, когда у вас есть несколько асинхронных операций, которые необходимо запускать параллельно, и вам нужно выполнять операции, как только любой из входных данных разрешается / отклоняется.

Резюме

В этой статье мы узнали о различных доступных API обещаний. В частности, Promise.all, Promise.any и Promise.race.

Чтобы прочитать последнюю статью серии о async / await, нажмите здесь.

Если вы нашли эту статью полезной, не забудьте аплодировать и поделиться ею с друзьями. Если у вас есть предложения / комментарии, дайте мне знать. Обязательно подпишитесь на меня, чтобы не пропустить ни одной статьи.