Как ответ XMLHttpRequest направляется на правильный обратный вызов браузера? - PullRequest
1 голос
/ 24 июня 2009

Я создал веб-страницу, которая использует Ajax для обновления некоторых значений без перезагрузки страницы. Я использую объект XMLHttpRequest для отправки запроса POST, и я назначаю функцию обратного вызова, которая вызывается при получении ответа, и она прекрасно работает.

Но ... как в мире браузер узнает, что некоторые данные, поступающие с какого-либо ip: порта, должны быть отправлены именно этой функции обратного вызова? Я имею в виду, что в худшем случае, если у меня есть Firefox и IE, делающие несколько POST-запросов примерно в одно и то же время с одного и того же сервера, и даже делающие последующие POST-запросы до того, как ответы приходят на предыдущие, как поступают данные? направляется к нужным функциям обратного вызова ??

Ответы [ 3 ]

0 голосов
/ 24 июня 2009

Общая идея заключается в том, что ваш браузер полностью открывает новое соединение, отправляет запрос на сервер и ожидает ответа. Все это в одном соединении, которое управляется браузером через JavaScript API. Соединение не разрывается, а затем снова устанавливается, когда браузер что-то нажимает, поэтому браузер, отправив запрос, знает, что делать, когда запрос завершается.

Что действительно делает вещи асинхронными, так это то, что эти соединения могут происходить отдельно в фоновом режиме, что позволяет отправлять и возвращать несколько запросов, ожидая ответов. Это дает вам приятный эффект AJAX, который выглядит так, будто сервер возвращает что-то позднее.

0 голосов
/ 24 июня 2009

Каждый HTTP-запрос выполняется по отдельному TCP-соединению. Браузер просто ожидает возвращения данных по этому соединению и затем вызывает функцию обратного вызова.

На более низком уровне реализация TCP в вашей ОС будет отслеживать, какие пакеты принадлежат каждому сокету (то есть соединению), используя разные «исходные порты» для каждого. Будет несколько исходных таблиц, сопоставляющих порты с открытыми сокетами.

Стоит отметить, что количество одновременных подключений браузера к любому серверу ограничено (обычно до 2). Это было разумно еще в старые времена, когда страницы перезагружались для отправки и получения данных, но в эти просвещенные дни AJAX это настоящая неприятность. См. на странице для интересного обсуждения проблемы.

0 голосов
/ 24 июня 2009

Каждый запрос имеет свое собственное соединение. Означает, что если у вас одно соединение, конечно, у вас будет один ответ, и этот ответ будет в вашем обратном вызове.

...