После странного поведения JS я меняю маршрут и помогаю плыть по другому морю: Node.js и то, как он работает с асинхронными операциями.
Бьюсь об заклад, вы много раз слышали «Node.js работает в одном потоке», и я уверен, что каждый раз, когда вы это слышали, вы думали: «Тогда как можно распараллелить операции? Я использую async/await и обратные вызовы!».
Всякий раз, когда мы запускаем программу Node.js, автоматически создается поток, и весь наш код будет выполняться в одном месте.
Однопоточность значительно упрощает программирование, не беспокоясь о параллелизме, но вам нужно только уделять внимание коду и избегать ситуаций блокировки потоков, таких как бесконечные циклы.
Если вы смелый искатель приключений, я предлагаю вам изучить тему рабочих потоков.
Как тогда возможна асинхронность? Я хочу ответить визуально.
Взгляните на этот фрагмент кода и его вывод:
Теперь немного визуальных пояснений
Изображение из Node.js Design Patterns — Mario Casciaro, Pack Publishing
Давайте добавим в эту схему новую концепцию: стек вызовов.
Стек вызовов представляет собой очередь LIFO, из которой цикл событий постоянно проверяет, есть ли какая-либо функция, которую необходимо запустить. В нашем конкретном случае это будет работать так:
Одна повторяющаяся фраза в этой статье — «Цикл событий».
Цикл событий — это сердце Node.js/Javascript, и он помогает нам справляться с асинхронными операциями.
Вот визуальное объяснение того, как это работает:
Изображение из блога LogRocket
Я надеюсь, что это было полезно!