До этого момента мы узнали
Теперь мы рассмотрим некоторые другие методы в Promise API и когда их использовать.
Promise.all
Метод Promise.all()
принимает на вход итерацию обещаний и возвращает единственный Promise
Это возвращенное обещание будет разрешено только тогда, когда все входные обещания будут разрешены, и его значение будет массивом результатов входных обещаний.
Если какой-либо из входных обещаний отклонить или выдает ошибку, возвращенное обещание будет немедленно отклонено с этой ошибкой / сообщением.
В приведенном выше примере в метод Promise.all
переданы 3 переменных.
- Обещание, которое разрешится немедленно со значением 3
- Это не обещание. это означает, что мы также можем передавать в метод
Promise.all
значения, не являющиеся обещаниями. - Обещание, которое разрешится через 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 обещания
- Обещание, которое будет немедленно отклонено со значением 3
- Обещание, которое разрешится через 2 секунды со значением "
resolved second
" - Обещание, которое разрешится через 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, нажмите здесь.
Если вы нашли эту статью полезной, не забудьте аплодировать и поделиться ею с друзьями. Если у вас есть предложения / комментарии, дайте мне знать. Обязательно подпишитесь на меня, чтобы не пропустить ни одной статьи.