AJAX:在循环中发送xmlhttp请求...但是没有收到所有响应

时间:2011-05-13 10:59:01

标签: php ajax

我在下面有这个功能,我在循环中调用该函数 我得到警报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 个答案:

答案 0 :(得分:1)

您似乎依赖于单个全局xmlhttp变量。不要那样做。

答案 1 :(得分:1)

确保您为每个请求发送一些独特的内容。 IE有时会缓存AJAX请求响应 - 如果您追加查询的唯一内容(例如随每个请求递增的计数器),它将阻止IE返回缓存的响应。

答案 2 :(得分:1)

<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>

答案 3 :(得分:1)

当您使用循环发送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
}

答案 4 :(得分:1)

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

在上面一行中,您提到了true作为最后一个参数,而不是使用false。

因此,AJAX成为同步呼叫,interprter将等待响应到达。

但是对于每个响应检查为null。