Jquery Ajax вызывает сбой Internet Explorer?

Должен признаться, это мой первый пост на этом сайте, поэтому извиняюсь за совет, если что-то делаю не так (форматирование и т.д.).

В любом случае, я создаю что-то вроде mmo, используя javascript (и jQuery), и пока все работает нормально в Chrome, Safari, Firefox и т. д. Однако я обнаружил, что где-то по пути происходит сбой Internet Explorer.

Воспроизведя сбой, я сузил его до этого кода:

function getUpdates(){
var data={uid:playerName,area:1,mid:lastMessage};
$.ajax({ 
    url: "getUpdates.py", 
    timeout: 32000,
    data: data,
    type:"GET",
    complete: function(obj, textStatus){
            //handleUpdates(obj);
        getUpdates();
        }
    });
}

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

Обратите внимание, что строка с надписью «complete:...» была опробована как:

success: function(...){getUpdates();...},
error: function(...){getUpdates();...}

с той же проблемой.


person Sylvan    schedule 06.09.2010    source источник
comment
Похоже, вы все сделали правильно... поздравляю! Однако вам, вероятно, следует добавить теги javascript и/или ajax вместо long-polling.   -  person SLaks    schedule 06.09.2010
comment
Почему бы не установить тайм-аут перед повторным вызовом getUpdates().   -  person James Black    schedule 06.09.2010
comment
серверу требуется много времени, чтобы ответить на запросы (поэтому существует ограничение времени ожидания в 32 секунды), некоторые запросы могут занять до 30 секунд, прежде чем будет сгенерирован ответ. Игра работает в режиме реального времени, поэтому добавление дополнительной задержки на стороне клиента между загрузками очень заметно и не сильно экономит пропускную способность.   -  person Sylvan    schedule 06.09.2010


Ответы (1)


IE мгновенно возвращает вызов AJAX из кеша.

Вы должны добавить случайный параметр к URL-адресу, чтобы заставить IE игнорировать свой кеш, например:

url: "getUpdates.py?RandomNumber=" + Math.random(), 

(Вы также можете использовать new Date)


Кроме того, вам, вероятно, следует проверять наличие обновлений немного медленнее, добавив 5-секундную задержку:

complete: function(obj, textStatus){
        //handleUpdates(obj);
    setTimeout(function() { getUpdates(); }, 5000);   //milliseconds
}
person SLaks    schedule 06.09.2010
comment
+1 - я не считал, что это кешируется, поэтому отключение кеширования может решить эту проблему. Я просто предполагаю, что кеширование отключено для вызовов ajax, плохое предположение. - person James Black; 06.09.2010
comment
спасибо, я попробовал это, и это сработало как шарм! Я не знал, что браузеры будут кэшировать вызовы AJAX, спасибо. - person Sylvan; 06.09.2010
comment
Вы должны иметь возможность добавить настройку cache: false в функцию ajax, и она сделает работу по добавлению случайного (ну, метки времени) параметра в URL-адрес для вас. - person andyface; 08.05.2014
comment
Связанный: stackoverflow.com/questions/4303829/ - person StvnW; 11.11.2014