2009-11-21 2 views
4

У меня есть ситуация, когда мой сайт должен быстро получать данные с моего сервера через AJAX.XMLHttpRequest, используемый для поиска более быстрого сервера

Мой сайт работает на порту 80, обслуживая обычные веб-страницы. Обычно я запускаю свой сервер AJAX на порт 8001 (я использую JSONP, и это отлично работает). Это работает для большинства пользователей. Тем не менее, некоторые пользователи блокируются из высоких портов своими локальными брандмауэрами.

Для того, чтобы позволить людям, которые имеют исходящие соединения на порт 8001 заблокирован, чтобы использовать мой сайт, я хочу упасть обратно на порт 80, в случае, если пользователь не может получить ответ на порт 8001.

Причина Я не использую порт 80 все время, что иногда у людей есть «умные» антивирусные шлюзы или другие брандмауэры на уровне приложений, которые перехватывают исходящие соединения на порту 80. Они добавляют пару сотен миллисекунд к моему времени в оба конца. Мой сервис AJAX должен минимизировать время отклика в оба конца.

Я использую jQuery, чтобы упростить работу с XMLHttpRequest. Я использую вариант JSONP, и эта часть работает - вытягивание запросов AJAX с другого IP-адреса или порта не является проблемой сама по себе.

Идея, которую я имею, заключается в том, что, когда страница загружается первой, она срабатывает при 2 вызовах getJSON. Один на порт 8001, а другой - на порт 80. Один и тот же обработчик ответа используется в обоих вызовах.

Первый вызов обработчика ответов устанавливает мою переменную «portToUse», а затем работает с нормальной функциональностью.

Это работает, когда порт 8001 не заблокирован. Если порт 8001 заблокирован, это также работает. Тем не менее, задержка на 5 секунд до моего ответа от порта 80 возвращается. Это не вызвано сервером. Я хотел бы устранить эту задержку.

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

Я не уверен, что я прав. Если да, то есть ли способ обойти эту функциональность и одновременно отключить оба XMLHttpRequest? Если я ошибаюсь, у вас есть предложение относительно того, что может вызвать задержку в получении моего второго ответа (от порта 80 на моем сервере)? Любые и любые другие предложения приветствуются.

EDIT: Такое поведение наблюдается только в Firefox 3 и Opera 9.63. IE7 и Chrome не показывают эту задержку.

+0

1+ хороший вопрос! – a432511

ответ

3

AJAX вызовы происходят одновременно.

Я бы установил глобальный var portToUse = 80 (по умолчанию) и установил функцию, вызывающую на порт 8001 для получения очень небольшого количества данных. Если запрос ajax успешно возвращается на 8001, измените значение portToUse = 8001;

Запросы, которые вы начнете немедленно, выйдут на 80, пока вы не узнаете, что 8001 открыт. Затем он будет переключаться и все последующие запросы будут сделаны на 8001.

Вы также можете сделать это:

var request = $.ajax({ 
         type: 'POST', 
         url: 'test.html:8001', 
         success: function(){ portToUse = 8001; } 
        }); 

setTimeout(function(){ 

    request.abort(); 

}, 1000); 

Таким образом, если запрос занимает больше времени, чем второй, мы отменяем запрос все вместе и ваши запросы продолжать использовать порт 80. Вы можете установить это значение тайм-аута на что угодно, в зависимости от того, сколько времени вы хотите разрешить попытке запроса. 500 будет 500 мс и так далее ...

+0

Это может сработать. Однако, если задержка, которую я испытываю в FF, все еще происходит, у меня будет такое поведение: req-> 80: 20ms, req-> 8001-> никогда не возвращается, 2-й req-> 80: 5020ms (потому что он был задержан время ожидания до 8001), 3-й req-> 80: 20ms и т. д. Это тоже не приемлемо. –

+0

таймаут в запросе на 8001 не должен влиять на ваши другие запросы. Я собираюсь отредактировать свой ответ и предложить другой подход ... – a432511

Смежные вопросы