ОБЩАЯ ЦЕЛЬ
Я хотел бы знать, как следующие части среды javascript взаимосвязаны как система.
- Javascript Engine
- Цикл событий
- Очередь событий
Мы можем ограничить это средой браузера, поскольку узел описан в другой статье (здесь)
ЧТО Я (верю) ПОНИМАЮ:
Javascript является однопоточным и поэтому имеет только один стек вызовов.
Среды Javascript предоставляют только несколько действительно асинхронных функций. Они могут включать setTimeout (), setInterval () и функции ввода-вывода.
- Разработчик не может создавать свои собственные асинхронные функции без использования одной из них.
- Сам Javascript работает синхронно, но через его асинхронные функции могут выполнять обратный вызов потенциально блокирующим функциям, как только текущий стек вызовов очищен.
ПРИМЕР:
console.log(‘Sync code started…’);
setTimeout(function asyncLog() {
console.log(‘Async function has completed’)
}, 2000);
console.log(‘Sync code finished…')
ПРИМЕР ШАГИ:
(Пожалуйста, исправьте шаги, если я ошибаюсь)
- «Синхронизация кода запущена…» регистрируется.
- setTimeout добавляется в стек, но сразу возвращает управление
- setTimeout отправляется другому «потоку» ... «worker»? вне единственного потока javascript для подсчета 2000 миллисекунд
- «Синхронизация кода завершена…» регистрируется.
- Через 2000 миллисекунд asyncLog () помещается в очередь событий.
- Поскольку стек вызовов очищен, цикл событий проверяет очередь событий на наличие ожидающих обратных вызовов.
- asyncLog () удаляется из очереди и помещается в стек циклом событий
- "Асинхронная функция завершена" регистрируется
- стек вызовов теперь очищен
ВОПРОСОВ
На эти вопросы не нужно отвечать один за другим, если кто-то может дать обзор шагов того, как и где асинхронные функции (например, setTimeout) переходят с момента первого обращения к стеку вызовов до момента их обратного вызова в стек вызовов.
- On step 3, who produces this new thread? Is it the browser?
- This new thread is being blocked correct?
- Что произойдет, если у вас есть цикл, который создает 1000 setTimeout. Создано 1000 «потоков»?
- Есть ли ограничение на количество потоков, которые могут быть созданы одновременно?
- Когда новый поток завершает выполнение, как он попадает в очередь?
- Кто поставляет очередь событий?
- Who supplies the Event Loop?
- Does the event loop poll the Event Queue?
- Знает ли поток javascript о цикле событий? Или цикл событий просто помещает вещи в стек?
- Как цикл событий узнает, что стек чист?