Можете объяснить асинхронность в JS?

Здравствуйте.

Заинтересован именно в глобальном понимании работы JS (именно "голого" JS, JS в браузере, NodeJS, и.т.д).

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

WebAPI браузера поедоставляет вещи типа setTimeout, или async await, коллбек-функции которые закидываются в очередь, а оттуда в порядке своей приоритетности попадают в стек по очереди. Промисы обрабатываются в приоритетном порядке.

По итогу, любые асинхронные операции попадают в основной и единсивенный стек вызовов и все равно выполняются последовательно?

Т.е получается, что это мнимая многопоточность? Под капотом все равно все выполняется в одной пробирке, так сказать?

Пока выполняется функция в стеке, то другие операции недоступны. А что если "асинхронные" операции занимают много памяти и выполняются долго. Если они выполняются в том же стеке, то они также перекроют доступ ко всем остальным операциям?

Буду рад если разъясните. Такое ощущение, что упускаю какие-то важные нюансы, либо неправильно понимаю эти.
  • Вопрос задан
  • 840 просмотров
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
WebAPI браузера поедоставляет вещи типа setTimeout, или async await, коллбек-функции которые закидываются в очередь, а оттуда в порядке своей приоритетности попадают в стек по очереди. Промисы обрабатываются в приоритетном порядке.
Обычные callback-функции не попадают в очередь, они вызываются в общем стеке. Кроме промисов в приоритетную очередь микрозадач функция может быть добавлена через queueMicrotask(function).
А что если "асинхронные" операции занимают много памяти и выполняются долго. Если они выполняются в том же стеке, то они также перекроют доступ ко всем остальным операциям?
Асинхронные операции выполняются отдельными служебными потоками параллельно с основным стеком. Поэтому сами они не могут заблокировать основной стек. По завершению/таймеру асинхронная операция кладёт функцию в очередь микро- или макрозадач.
Ответ написан
Комментировать
AgentSmith
@AgentSmith
Это мой правильный ответ на твой вопрос
Да, всё верно. Операции попадают в Event Loop и оттуда они берутся на обработку.
Здесь можно более подробно почитать https://blog.sessionstack.com/how-javascript-works...
Ответ написан
Комментировать
@Just__Den
FULL STACK
JS однопоточный, но его движки v8 и libuv написаны на С++, который может использовать потоки ядра машины, на которой установлен JS для его целей. Причём количество подключаемых потоков можно изменять в настройках (для node)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
25 апр. 2024, в 10:42
150000 руб./за проект
25 апр. 2024, в 10:41
2000 руб./за проект
25 апр. 2024, в 10:25
2000 руб./за проект