Какие существуют стеки в Web API для выполнения асинхронных js операций?

Помогите понять из каких стеков состоит Web API для работы асинхронного js кода. На схемах показывают, что все асинхронные операции выполняются на стороне браузера, перечисляя только самые основные (Timers, Promise, XRH). Хотелось бы узнать:
  1. сколько и какие существуют виды асинхронный операций, которые выполняет браузер;
  2. выполняются ли все эти виды операций раздельно каждая в своём стеке (отдельный стек для промисов, отдельный под сетевые запросы) или все операции выполняются в едином стеке;
  3. в какие очереди они потом попадают и почему.


5d80c13070097254162307.png
  • Вопрос задан
  • 1434 просмотра
Пригласить эксперта
Ответы на вопрос 5
@afanasiyz
Javascript-разработчик
Отвечу насколько знаю (и насколько понял вопрос), вопрос отличный, Автор - молодец.

1. Таймеры, xhr запросы, четыре вида Observers: Mutation, Intersection, Resize, Performance Observers. Другие варианты асинхронных операций сложно представить (могу ошибаться, и их еще куча).

2. смотря про какие стэки мы говорим - если со стороны движка и Web API - понятия не имею, в какие стэки он это все засовывают, подозреваю, что в зависимости от движка разные реализации этих операций, и они по разному работают с памятью (тут нужны сишники, которые знают исходники движков браузеров). Если мы говорим про стэки в javascript - опять же, зависит от того, какой стэк вы имеете в виду - стэк вызовов, очевидно, сохраняется от той функции, которая вызвала нашу асинхронную функцию, по памяти, я думаю, все располагается в общем стэке (с изоляцией, конечно).

3. Промисы попадают в microtasks queue - выполняются один за другим, пока не закончатся микрозадачи, чтобы перейти к макрозадаче. Остальные асинхронные операции попадают в tasks queue, и там работают одна за другой, прерываясь на исполнение микрозадач, если они появились.
То есть по приоритезации - микрозадачи приоритетнее макрозадач, как только макрозадача кончилась, движок смотрит, есть ли микрозадачи, и выполняет их, и лишь потом переходит к следующей макрозадаче.
Ответ написан
Комментировать
@vgbege
автор молодец, картинка красивая. теперь о грустном :)

call stack это обычный стек вызовов, как и в других языках программирования. в javascript call stack один, поскольку javascript это single threaded language. вопрос сколько стеков смысла не имеет.

к вопросам
1. ну а какая разница, честно говоря? есть i/o, timers, observers, завтра еще что-нибудь возникнет, достаточно считать, что колбэки попадают в очередь по мере поступления, а дальше FIFO и все такое

2. в едином. он же один :) вообще, вопрос выглядит не имеющим смысла. есть операции, а есть их колбэки. предположим, что стек и очереди попутаны местами, тогда ответ возможно. возможно колбэки попадают в разные очереди, но это такая тонкость, которая реальную разработку практически не затрагивает. при желании можно почитать https://www.w3.org/TR/2014/REC-html5-20141028/weba... - там все тонкости.

3. они (операции) уже никуда не попадают, они завершаются и убираются из стека вызовов. если речь об их колбэках, см. пункт 2.

предлагаю сначала почитать статью с картинкой попроще, например https://developer.mozilla.org/en-US/docs/Web/JavaS...

еще можно поиграться с latentflip.com/loupe
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Ответ написан
Комментировать
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Все зависит исключительно от самого конкретного API. Сферического API в вакууме не существует
Ответ написан
Комментировать
deksden
@deksden
Enterpreneur
Почему то никто нигде не упоминул worker - как аналог threads в других средах. Нынче это добро есть и в браузере и в ноде.

про браузер, например:
https://developer.mozilla.org/ru/docs/DOM/Using_we...
https://habr.com/ru/post/261307/

Впрочем, всё легко гуглится.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы