В синхронном программировании мы концептуализируем код как серию последовательных вычислительных шагов, решающих конкретную проблему. Каждая операция блокируется, что означает, что только после завершения операции возможно выполнение следующей. Такой подход делает код очень простым для чтения, понимания и отладки.

С другой стороны, в асинхронном программировании некоторые операции, такие как чтение из файла или выполнение сетевого запроса, запускаются, а затем выполняются «в фоновом режиме». Когда мы вызываем асинхронную операцию, следующая за ней инструкция выполняется немедленно, даже если предыдущая асинхронная операция еще не завершилась. В этом сценарии нам нужен способ получить уведомление о завершении асинхронной операции, а затем продолжить поток выполнения, используя результаты операции. Самый простой механизм получения уведомления о завершении асинхронной операции в Node.js — это обратный вызов, который представляет собой не что иное, как функцию, вызываемую средой выполнения с результатом асинхронной операции.

Обратный вызов — это основной строительный блок, на котором основаны все остальные асинхронные механизмы. На самом деле, без обратных вызовов у нас не было бы промисов и, следовательно, даже async/await; у нас также не было бы потоков или событий. Вот почему важно знать, как работают обратные вызовы.