После странного поведения JS я меняю маршрут и помогаю плыть по другому морю: Node.js и то, как он работает с асинхронными операциями.

Бьюсь об заклад, вы много раз слышали «Node.js работает в одном потоке», и я уверен, что каждый раз, когда вы это слышали, вы думали: «Тогда как можно распараллелить операции? Я использую async/await и обратные вызовы!».

Всякий раз, когда мы запускаем программу Node.js, автоматически создается поток, и весь наш код будет выполняться в одном месте.

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

Если вы смелый искатель приключений, я предлагаю вам изучить тему рабочих потоков.

Как тогда возможна асинхронность? Я хочу ответить визуально.
Взгляните на этот фрагмент кода и его вывод:

Теперь немного визуальных пояснений

Изображение из Node.js Design Patterns — Mario Casciaro, Pack Publishing

Давайте добавим в эту схему новую концепцию: стек вызовов.

Стек вызовов представляет собой очередь LIFO, из которой цикл событий постоянно проверяет, есть ли какая-либо функция, которую необходимо запустить. В нашем конкретном случае это будет работать так:

Одна повторяющаяся фраза в этой статье — «Цикл событий».

Цикл событий — это сердце Node.js/Javascript, и он помогает нам справляться с асинхронными операциями.

Вот визуальное объяснение того, как это работает:

Изображение из блога LogRocket

Я надеюсь, что это было полезно!