Как вы знаете, неблокирующее поведение встроено в javascript и поэтому было перенесено в среду Node.JS. Это позволяет Node.JS превосходить многие веб-фреймворки в отношении операций ввода-вывода.

Но если вы какое-то время программировали на javascript, вы знаете, что писать свои программы таким образом, чтобы ни одна операция не блокировала текущий поток, — это огромная головная боль. Возможно, вы слышали о термине «ад обратного вызова». Эта ситуация возникает из-за того, что при выполнении операции (например, при запросе API) вам необходимо передать обратный вызов, который будет выполняться после того, как API вернет некоторые данные. Но если вы хотите запросить другой API или вставить полученные данные в базу данных, вам нужно будет передать другой обратный вызов в этот фрагмент кода, обрабатывающий эту операцию, и он должен быть включен в ваш обратный вызов API-запроса, чтобы он мог запускаться сразу после операции API. Как видите, это может создать кошмарно запутанную базу кода, поскольку вы продолжаете добавлять операции, которые должны выполняться последовательно.

Когда-то в javascript была добавлена ​​большая функция — обещания. Это позволяет вам связывать различные функции обратного вызова без ужасной вложенности, которую вы получаете с адом обратных вызовов. Но Javascript сделает вас лучше. Что, если бы я сказал вам, что вы можете написать асинхронный код таким логичным образом, что он будет выглядеть синхронно? Все, что вам нужно сделать, это использовать ключевые слова async и await.