Javascript AJAX иногда не удается выполнить - PullRequest
1 голос
/ 10 декабря 2010

Я использую следующую функцию ajax:

function callAjax(request,callback)
{
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            if(callback != null)callback(xmlhttp.responseText);
        }
    }
    xmlhttp.open("GET",request,true);
    xmlhttp.send();
}

И я обнаружил, что когда я вызываю эту функцию 3 или более раз подряд, некоторые из обратных вызовов иногда не выполняются.Возникает запрос ajax и возвращается результат, но каким-то образом функция обратного вызова не вызывается.Хуже того, это даже не происходит последовательно - иногда это работает, иногда нет.Что я хочу знать, почему?И что более важно, как я могу это исправить?Насколько я могу судить, обратные вызовы будут выполняться, если между ними будет промежуток не менее 4 миллисекунд.Если две страницы вернутся в течение этого периода времени, только одна из них (вторая, я верю, но я не уверен, что это всегда так) будет обрабатываться.уверен, что я жду только одного ajax-запроса на возврат за один раз (через либеральное использование sleep ()).Тем не менее, это значительно замедляет страницу;Я хочу быть в состоянии выполнить все три (или более) запроса и заставить их выполнять свои обратные вызовы всякий раз, когда они возвращаются.

Что я делаю не так?Как мне заставить это работать?

NB: Я не ищу кого-то, кто бы сказал: «О, вы должны использовать jquery».Я не хочу использовать какие-либо внешние библиотеки для этого - пожалуйста, просто скажите мне, как исправить код, который у меня есть.

Ответы [ 3 ]

0 голосов
/ 10 декабря 2010

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

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

0 голосов
/ 10 декабря 2010

xmlhttp - глобальная переменная, поэтому она будет перезаписана, если у вас одновременно будет более одного вызова.

Вы также используете запрос GET.GET-запросы кэшируются, если не задан неправильный заголовок.См. "heartbeat" logger quration для получения подробной информации о том, как избежать кэширования.

0 голосов
/ 10 декабря 2010

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

xmlhttp.onreadystatechange=function()
{
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        if(typeof callback == 'function')
            callback.call(xmlhttp, xmlhttp.responseText);
    }
    else{
        alert("status is " + xmlhttp.status);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...