ОБЩАЯ ЦЕЛЬ
Мне нравится знать, как следующие фрагменты среды javascript соединяются как система.
- Javascript Engine
- Цикл событий
- Очередь событий
Мы можем ограничить это средой браузера, поскольку node рассмотрен в другой статье (здесь)
ВЕЩИ Я (верю) ПОНИМАЮ:
-
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…')
ПРИМЕР ШАГИ:
(Пожалуйста, исправьте шаги, если Im неправильно)
- "Начат запуск кода синхронизации..."
- setTimeout добавляется в стек, но сразу возвращается управление
- setTimeout отправляется другому "потоку... работнику"? вне javascripts одного потока для подсчета 2000 миллисекунд
- "Завершено завершение кода синхронизации..."
- После 2000 миллисекунд asyncLog() помещается в очередь событий
- Поскольку столбец очищен, Event Loop проверяет очередь событий для ожидающих обратных вызовов
- asyncLog() удаляется из очереди и помещается в стек с помощью цикла событий
- 'Завершено выполнение функции Async
- callstack теперь прозрачен
ВОПРОСЫ
Этим не нужно отвечать один за другим, если кто-то может дать обзор шагов, как и где асинхронные функции (такие как setTimeout) идут от момента, когда они впервые попали в стек вызовов, когда они возвращаются к стоп-казу.
- На шаге 3, кто создает этот новый поток? Это браузер?
- Этот новый поток заблокирован правильно?
- Что произойдет, если у вас есть цикл, который создает 1000 setTimeouts. Созданы ли потоки 1000 '?
- Есть ли ограничение на количество потоков, которые могут появляться за раз?
- Когда новый поток заканчивается, как он заканчивается в очереди?
- Кто поставляет очередь событий?
- Кто поставляет Event Loop?
- Проводит ли цикл событий очередь событий?
- Является ли поток javascripts осведомленным о цикле событий? Или цикл событий просто вставляет вещи в стек?
- Как цикл цикла знает, когда стек ясен?