AJAX: отправка запросов xmlhttp в цикле ... но все ответы не получены - PullRequest
3 голосов
/ 13 мая 2011

У меня есть эта функция ниже, и я вызываю эту функцию в цикле Я получаю предупреждение n раз, но только n-1 или иногда n-2 ответов

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)
                        {
                            alert(xmlhttp.responseText);
                            //document.getElementById("warnings_panel").innerHTML+=xmlhttp.responseText;
                        }
                }

                alert("in ajax) 

                xmlhttp.open("GET","getresponse.php?start="+ start
    + "&end=" + end,true);
                xmlhttp.send();

Ответы [ 5 ]

1 голос
/ 13 мая 2011
xmlhttp.open("GET","getresponse.php?start="+ start
    + "&end=" + end,true); 

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

Таким образом, AJAX становится синхронным вызовом, интерпретатор будет ждать поступления ответов.

Но для каждого ответа проверьте на ноль.

1 голос
/ 13 мая 2011

Когда вы используете цикл для отправки ajax-запроса и используете один объект, существует вероятность, что второй или концептуальный запрос может быть отправлен даже до того, как будет отправлен ответ на первый запрос.

Поэтому используйте отдельные объекты для отправки индивидуальных запросов.

Пример кода должен быть таким ..

for(i=0; i<10; i++){
if (window.XMLHttpRequest)
                {// code for IE7+, Firefox, Chrome, Opera, Safari
                        eval("xmlhttp"+i+"=new XMLHttpRequest()");
                }
                else
                {// code for IE6, IE5      
                }
                eval("xmlhttp"+i+".onreadystatechange=function(i)");
                function(var obj)
                {
                 //function contents
                }

                alert("in ajax) 

                // assign responsetext and send code
}
1 голос
/ 13 мая 2011

Убедитесь, что вы отправляете что-то уникальное с каждым запросом.IE иногда кэширует ответы на запросы AJAX - если вы добавляете что-то уникальное к вашему запросу (например, счетчик, который увеличивается с каждым запросом), это не позволит IE вернуть кэшированный ответ.

1 голос
/ 13 мая 2011
<html>
<body>
</body>
<script type="text/javascript" defer>
function ajaxping() {

     var xmlhttp ={};

             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)

                         {

                         var status = xmlhttp.status;

                         var isSuccess = status >= 200 && status < 300 || status === 1223 || status === 304;

                                                                         if(isSuccess) {

                                                                         alert("got success response");

                                                                         }

                       }

                 }



                 alert("in ajax");



                 xmlhttp.open("GET","test.html");

                 xmlhttp.send();

}



var func = function() {

for(var i=0;i<10;i++){

ajaxping();

}

}

func();

</script>

</html>
1 голос
/ 13 мая 2011

Вы, похоже, зависите от одной глобальной переменной xmlhttp.Не делай этого.

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