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


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

2 130

2 ответа:

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

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

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

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

вот некоторые статьи по реквизитам:

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

точнее, посмотрите на заголовки: "поток событий", "очередь событий" и "события, не связанные с пользователем": вы узнаете, что:

  1. Javascript выполняется в одном потоке для каждой вкладки или окна браузера.
  2. события ставятся в очередь и выполняются последовательно.
  3. запрос на выполнение и обратные вызовы выполняются с помощью очереди событий.

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