Как JavaScript обрабатывает ответы AJAX в фоновом режиме?

Поскольку JavaScript работает в одном потоке, после выполнения запроса AJAX, что на самом деле происходит в фоновом режиме? Я хотел бы получить более глубокое понимание этого, может ли кто-нибудь пролить свет?

Ответ 1

Ниже крышек javascript имеет очередь событий. Каждый раз, когда заканчивается поток выполнения javascript, он проверяет, есть ли в очереди очередное событие. Если есть, он вытаскивает его из очереди и запускает это событие (например, щелчок мыши).

Собственная сеть кода, которая находится под вызовом ajax, будет знать, когда будет выполнен ответ ajax, и событие будет добавлено в очередь событий javascript. Как знает собственный код, когда выполняется вызов ajax, зависит от реализации. Он может быть реализован с помощью потоков, или он может также управляться событиями (это не имеет большого значения). Суть реализации заключается в том, что когда выполняется ajax-ответ, некоторый собственный код будет знать это и помещает событие в очередь JS.

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

Поскольку все внешние события проходят через очередь событий, и никакое событие никогда не запускается, а javascript фактически запускает что-то еще, он остается однопоточным.

Вот несколько статей о деталях:

Ответ 2

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

Точнее, посмотрите на заголовки: "Event Flow", "Event Queuing" и "Non-user Events": вы узнаете, что:

  • Javascript запускается в одном потоке для каждой вкладки или окна браузера.
  • События помещаются в очередь и выполняются последовательно.
  • XMLHttpRequest выполняется реализацией, а обратные вызовы запускаются с использованием очереди событий.

Примечание. Оригинальная ссылка была: ссылка, но теперь она мертва.