Обещания всегда были спасением в JavaScript для работы с асинхронными вещами в нашем коде. ES8 представил async/await, который можно использовать для написания «синхронных» асинхронных кодов.

Часто мы используем такой вариант использования, когда нам нужно синхронно выполнять несколько асинхронных задач. Например: мы должны выполнить Задачу-А и Задачу-Б. Обе задачи независимо асинхронны. Наша цель — сначала выполнить Задание-А, а затем Задание-Б. То есть синхронно. Давайте рассмотрим пример реализации решения для его достижения.

Экземпляр вышеупомянутого класса HandlerChain принимает несколько функций-обработчиков (они напоминают асинхронные задачи). Затем выполняем все асинхронные функции одну за другой — синхронно.

Идея состоит в том, чтобы возвращать Promise из каждой функции-обработчика (handler1, handler2, …). Ключевое слово async перед функцией означает одну простую вещь: она всегда возвращает обещание. В дополнение, внутри обратного вызова можно делать все, что угодно, пока мы не вызовем resolve (может быть, другой набор асинхронных задач? ;)

При выполнении всех обработчиков (в цикле) мы ждем обещания от каждого обработчика, чтобы получить возврат. Стоит отметить, что мы можем ожидать только внутри асинхронной функции. Буквально await заставляет выполнение кода JavaScript ждать, пока промис не будет выполнен. Временно двигатель может выполнять другие задачи. Это означает, что await не требует ресурсов процессора.

Имея дело с промисами, необходимо быть осторожным с обработкой ошибок. Если promise разрешается нормально, то await promise возвращает результат. Но в случае отказа приходится разбираться с ошибкой. Давайте прервем эту историю в другой солнечный день.

Скажи нет обратным звонкам! :D
P.S: небезразлично!