Как JavaScript обрабатывает ответы AJAX в фоновом режиме?
поскольку JavaScript выполняется в одном потоке, после выполнения запроса AJAX, что на самом деле происходит в фоновом режиме? Я хотел бы получить более глубокое понимание этого, может ли кто-нибудь пролить свет?
2 ответа:
под обложками javascript имеет очередь событий. Каждый раз, когда поток выполнения javascript завершается, он проверяет, есть ли еще одно событие в очереди для обработки. Если есть, он вытаскивает его из очереди и запускает это событие (например, щелчок мыши).
сеть машинного кода, которая находится под вызовом ajax, будет знать, когда ответ ajax будет выполнен, и событие будет добавлено в очередь событий javascript. Как собственный код знает, когда ajax вызов делается, зависит от реализации. Он может быть реализован с помощью потоков или он также может быть сам управляемым событием (это не имеет большого значения). Суть реализации заключается в том, что когда ответ ajax будет выполнен, некоторый собственный код будет знать, что это сделано, и помещает событие в очередь JS.
Если Javascript не запущен в то время, событие будет немедленно вызвано, которое запустит обработчик ответа ajax. Если что-то работает в то время, то событие будет обрабатывается при завершении текущего потока выполнения javascript. Там не должно быть никакого опроса с помощью движка javascript. Когда часть Javascript завершает выполнение, JS engine просто проверяет очередь событий, чтобы увидеть, есть ли что-нибудь еще, что нужно запустить. Если это так, он выводит следующее событие из очереди и выполняет его (вызывая одну или несколько функций обратного вызова, зарегистрированных для этого события). Если в очереди событий ничего нет, то у интерпретатора JS есть свободное время (мусор сбор или простоя), пока какой-то внешний агент не помещает что-то еще в очередь событий и снова не разбудит его.
поскольку все внешние события проходят через очередь событий, и ни одно событие никогда не запускается, пока javascript фактически выполняет что-то другое, он остается однопоточным.
вот некоторые статьи по реквизитам:
- как работают таймеры Javascript-написано Джоном Resig
- события и сроки в Глубина
- W3 spec: HTML5 Event loops
- статья MDN о цикле событий
- презентация в очереди событий JS
- Цикл Событий JavaScript: Объяснил
- пять шаблонов, которые помогут укротить асинхронный Javascript
- Презентация Цикла Событий Javascript
- Видео Обсуждают, Как На JavaScript Работает (включая цикл событий в 10:27)
вы можете найти здесь очень полная документация по обработке событий в javascript.
Он написан парнем, работающим над реализацией javascript в браузере Opera.точнее, посмотрите на заголовки: "поток событий", "очередь событий" и "события, не связанные с пользователем": вы узнаете, что:
- Javascript выполняется в одном потоке для каждой вкладки или окна браузера.
- события ставятся в очередь и выполняются последовательно.
- запрос на выполнение и обратные вызовы выполняются с помощью очереди событий.
Примечание: исходная ссылка была:ссылке, но теперь мертв.