Есть два способа выполнения асинхронных операций в Javascript. Один из них — это функция обратного вызова, а другой использует обещания и синтаксис async/await.
Вот простая асинхронная операция, которая выполняется с помощью синхронной функции и синтаксиса then
promise внутри нее:
Те же результаты могут быть достигнуты с помощью функции async
и синтаксиса обещания then
вне функции:
Цепочка промисов может быть преобразована в асинхронную функцию с синтаксисом try
и catch
:
Асинхронные функции с методами try
и catch
позволяют добавлять несколько HTTP-запросов. В приведенном ниже примере операторы выполняются одновременно — второе обещание ожидает выполнения первого обещания. Время выполнения всех промисов составит 3 с.
Результат кода выше будет:
Promise fulfilled after 2 sec Promise fulfilled after 1 sec Calling promises took 3 sec.
В случае, когда мы хотим выполнять наши промисы последовательно, нам нужно добавить функцию myPromise
в переменную. В приведенном выше примере оба промиса запускаются одновременно. Поэтому его таймер setTimeout работает параллельно в фоновом режиме.
Результат кода выше будет:
Promise fulfilled after 1 sec Promise fulfilled after 2 sec Calling promises took 2 sec.
Аналогичного результата можно добиться, используя Promise.all
. Этот метод возвращает один промис, который разрешается, когда все входные промисы разрешены.
На этой диаграмме p1
разрешается в значение 1s
, а p2
разрешается в значение 2s
. Следовательно, Promise.all(promise1, promise2)
возвращает обещание, которое разрешается в массив, содержащий результаты p1
и p2
[v1, v2]
в 2s
.
Другими словами, Promise.all()
выполняет промисы одновременно и ждет разрешения всех промисов и возвращает новый промис, который разрешается в массив, содержащий результаты входных промисов.
Если один из входных промисов отклоняется, метод Promise.all()
немедленно возвращает промис, который отклоняется с ошибкой первого отклоненного промиса.