Есть два способа выполнения асинхронных операций в 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() немедленно возвращает промис, который отклоняется с ошибкой первого отклоненного промиса.