Некоторые подробности реализации упущены для упрощения понимания
Мы можем отследить, какие функции вызываются в JavaScript с помощью
Call stack позволяет узнать, в каком
мы сейчас находимся, какая функция сейчас вызвана, и куда мы попадём, когда текущий контекст будет удалён из стекаЕсть всего
, но на каждый вызов функцииJavaScript является
(выполняет всего одну команду за раз) и обладает моделью выполнения (каждая строчка кода выполняется в той последовательности, в которой она объявлена в коде)Но что, если мы хотим выполнить какой-то код не прямо сейчас, а спустя какое-то время? Например, после того, как получим данные от API?
😎 Удобно и понятно для разработчика
🤦🏻 Пользователю приходится долго ждать
🤦🏻 Пользователь не понимает, происходит что-то или нет
😎 Довольно легко понимать, разобравшись в таком коде лишь однажды
🤦🏻 Данные доступны только в callback. Прямая дорога к callback hell
Промисы работают в JavaScript (объект промиса) и в среде выполнения (получение value)
просто добавляет указанную функцию в
😎 Довольно читабельный код, очень похожий на код с синхронными вызовами
😎 Легко обрабатывать ошибки (например, с помощью catch)
🤦🏻 Многие разработчики не понимают, как это работает “под капотом”
🤦🏻 Такой код довольно непросто отлаживать
– Каждый отложенный промис-вызов помещается в очередь микротасков (
, в спецификации), а если это не промис, то в очередь задач ( )– Вызываем функцию (добавляем в call stack) только тогда,
(event loop проверяет это условие)–
над обычными тасками (вызываются раньше)Сейчас нет нормального способа добавить вручную микротаск. Это расстраивает Леонида Аркадьевича разработчиков фреймворков. Поэтому появилось предложение ввести queueMicrotask
, , , и позволяют нам отложить выполнение некоторых действий, пока нужные задачи не будут выполнены, при этом продолжая выполнять наш код строчка за строчкой
Асинхронный JavaScript – основа современного веба. Он позволяет нам делать сложные и быстрые, но “неблокирующие” приложения
У нас часто есть какие-то данные (например, списки), в которых мы хотим сделать что-то с каждым из элементов
Как мы обычно работаем с коллекциями данных:
Итераторы позволяют нам не заботиться о том, как именно мы получаем данные, а сконцентрироваться на том,
Итераторы каким-то образом
, какой элемент нужно вернуть следующим– Когда функция
объявляется, она получает привязку к окружающей локальной памяти, в которой она была объявлена– Когда мы возвращаем
, окружающие её данные возвращаются вместе с ней. В данном случае под глобальной меткой– Когда мы вызываем
и не находим там данные или текущую позицию, мы обращаемся к этим "привязанным" данным– Эти "привязанные" данные называются C.O.V.E. или
( )У
есть всё, что нужно, для работы:Теперь мы можем получать данные, не заботясь о реализации этого получения. А можем сконцентрироваться на том,
И, что самое главное, мы можем приостановить выполнение этой функции и вернуться к её выполнению потом, вызвав метод
В асинхронном JavaScript мы хотим:
–
, которая занимает продолжительное время (например, запрос данных с сервера)–
в синхронном стиле– Запустить некий функционал тогда,
Что, если мы выйдем из функции через
, запустив в ней долгую задачу, а потом вернёмся в эту функцию, когда выполнение долгой задачи закончится?