Является ли сам javascript синхронным и является ли среда асинхронной? - PullRequest
0 голосов
/ 03 мая 2019

Собственный javascript является однопоточным и синхронным. Только несколько объектов могут работать асинхронно и добавляться в очередь обратных вызовов, таких как HTTP-запросы, таймеры и события. Эти асинхронные объекты являются результатом реальной среды javascript, а не самого javascript. setTimeout (), похоже, является примером для асинхронного кода. Эта функция перемещается в контейнер веб-API, а затем, в конце концов, в очередь обратных вызовов. Похоже, не существует способа написания асинхронного кода в javascript, который бы не предусматривал использование объектов, перемещаемых в контейнер Web API. Я могу написать свои собственные объекты с обратными вызовами, но самое большее, что я могу сделать, это структурировать их так, чтобы они выполнялись в правильном порядке. Вы никогда не сможете написать код JavaScript, который работает параллельно, не опираясь на эти объекты.

Это мое понимание того, как это работает, если я ошибаюсь, поправьте меня.

1 Ответ

1 голос
/ 03 мая 2019

setTimeout и setInterval - это просто удобный способ вызвать некоторое асинхронное поведение для примера. Он является частью стандартной библиотеки javascript во всех реализациях, а не только частью среды браузера.

Но все другие источники асинхронного кода зависят от какого-то внешнего процесса. При выполнении HTTP-запроса ваш поток javascript говорит браузеру сделать запрос (какие заголовки, какие URL и т. Д.). Браузер, в соответствии со своими собственными скомпилированными внутренними компонентами, затем форматирует запрос, отправляет его, ожидает ответа и в конечном итоге добавляет элемент в цикл событий javascript, который будет обработан при следующем запуске цикла событий. Доступ к файловой системе и запросы к базе данных - два других распространенных примера асинхронного кода, который зависит от внешних процессов (ОС и база данных соответственно)

То, как javascript обрабатывает асинхронный код в однопоточном процессе, полностью зависит от этого цикла событий . Этот цикл событий в коде psuedo в основном таков:

while (queue.waitForMessage()) {
  queue.processNextMessage();
}

setTimeout говорит окружению, чтобы что-то вставлялось в эту очередь в какой-то момент в будущем. Но обработка этой очереди однопоточная. Одновременно может обрабатываться только одно сообщение о событии, но в эту очередь может быть добавлено любое число.


Вы можете получить истинный параллелизм с работниками , но это в основном добавляет новый процесс javascript, который сам по себе является однопоточным и имеет метод взаимодействия с сообщениями в и из основного процесса javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...