setTimeout
и setInterval
- это просто удобный способ вызвать некоторое асинхронное поведение для примера. Он является частью стандартной библиотеки javascript во всех реализациях, а не только частью среды браузера.
Но все другие источники асинхронного кода зависят от какого-то внешнего процесса. При выполнении HTTP-запроса ваш поток javascript говорит браузеру сделать запрос (какие заголовки, какие URL и т. Д.). Браузер, в соответствии со своими собственными скомпилированными внутренними компонентами, затем форматирует запрос, отправляет его, ожидает ответа и в конечном итоге добавляет элемент в цикл событий javascript, который будет обработан при следующем запуске цикла событий. Доступ к файловой системе и запросы к базе данных - два других распространенных примера асинхронного кода, который зависит от внешних процессов (ОС и база данных соответственно)
То, как javascript обрабатывает асинхронный код в однопоточном процессе, полностью зависит от этого цикла событий . Этот цикл событий в коде psuedo в основном таков:
while (queue.waitForMessage()) {
queue.processNextMessage();
}
setTimeout
говорит окружению, чтобы что-то вставлялось в эту очередь в какой-то момент в будущем. Но обработка этой очереди однопоточная. Одновременно может обрабатываться только одно сообщение о событии, но в эту очередь может быть добавлено любое число.
Вы можете получить истинный параллелизм с работниками , но это в основном добавляет новый процесс javascript, который сам по себе является однопоточным и имеет метод взаимодействия с сообщениями в и из основного процесса javascript.