Как JS определяет, когда вызывать функцию обратного вызова? - PullRequest
1 голос
/ 12 января 2012

Мне интересно, как работают обратные вызовы JavaScript.Я конкретно не могу понять, как работает асинхронный XmlHttpRequest.Как JS может определить, что сервер вернул какое-то значение (в одном потоке), и когда вызывать метод обратного вызова?Это основано на таймерах?

Ответы [ 5 ]

2 голосов
/ 12 января 2012

Очень похожий вопрос был дан здесь более подробно.

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

Может произойти некотороетаймеры задействованы для тайм-аутов, но таймеры не используются, чтобы знать, когда пришел ответ ajax.Это основано на сетевой поддержке на уровне ОС, которую использует браузер.

1 голос
/ 12 января 2012

Асинхронный характер XmlHttpRequest предоставляется на более низком уровне, чем JavaScript (в браузере). Функция обратного вызова инициируется браузером, сигнализирующим движку javascript, что запрос завершен.

1 голос
/ 12 января 2012

Помните, JavaScript работает в среде. Эта среда не является однопоточной. Когда xhr возвращает браузер (окружение), он уведомляет механизм javascript о том, что xhr возвратил, и он, в свою очередь, выполнит обратный вызов. Также помните, что, хотя модель программирования javascript для пользователя является однопоточной, сам по себе javascript не должен быть.

1 голос
/ 12 января 2012

в основном ..

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

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

1 голос
/ 12 января 2012

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

Я полагаю, что он использует какой-то стек / очередь [список или таблицу] для отслеживания вызовов и отключения функции ответа в зависимости от возвращаемой информации, сообщающей вам, на какой запрос он отвечал.

...