AJAX:在一个循环发送XMLHTTP请求

问题描述:

下面我有这个功能,我呼吁在一个循环中,我得到警报n次,但只有n-1或有时N-2的反应AJAX:在一个循环发送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 && 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(); 
+1

你怎么称呼这个功能?你的循环是什么样的?顺便说一句,你错过了ajax中''''后',但我认为这只是一个复制粘贴错误,否则它根本就不会运行。顺便说一句,使用'encodeURIComponent'总是正确地编码你的查询参数(变量'start'和'end')。 – 2011-05-22 23:02:43

+0

哦,是的!对不起...这个函数在for循环中调用其他函数...谢谢你的努力...如果你能帮助我,我将不胜感激 – koool 2011-05-22 23:05:17

+1

是的,但在上面的代码中显示它。 – 2011-05-22 23:07:08

onreadystatechange该功能当你的函数结束时会终止,因为xmlhttp对象被删除,因为它不是全局变量。我对吗?

更好

将只放AJAX请求的功能,从而使xmlhttp对象只创建一次(我用了一个较短的版本创建在这个例子中,xmlhttp对象)。

var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); 

function request() { 
    xmlhttp.open('GET', 'getresponse.php?start=' + start + '&end=' + end, true); 
    xmlhttp.onreadystatechange = function() { 
     if (this.readyState == 4 && this.status == 200) { 
      alert(xmlhttp.responseText); 
     } 
    } 
    xmlhttp.send(null); 
} 
+0

我已经在函数上面声明了xmlhttp变量,所以我认为这不是问题....从我听说这里的问题是我的新回复覆盖了前一个..我不知道如何克服它...感谢您的努力 – koool 2011-05-22 22:53:30

+1

重申您的第一条意见:**不**,你说得不对。这就是关闭的地方:JavaScript引擎知道它在函数结束时不会抛弃'xmlhttp'的值,所以它会一直保持活动状态,直到不再需要它为止。 – 2011-05-22 22:55:49

+1

您不应该每次重复使用相同的'xmlhttp';最好使用局部变量创建一个新的。现在,每次调用函数并执行'xmlhttp.open'时,可能的未决请求将被取消。 – 2011-05-22 23:05:22

一般来说,这应该可行,但我们需要更多关于如何真正运行该循环以了解可能出错的信息。

我还添加了encodeURIComponent,改变了回调函数中的条件,因为status并不总是200readyState达到4

function request(start, end) { 
    var xmlhttp; 

    if (window.XMLHttpRequest) 
     xmlhttp = new XMLHttpRequest(); 
    else 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 

    xmlhttp.open('GET', 'getresponse.php?start=' + encodeURIComponent(start) + '&end=' + encodeURIComponent(end), true); 
    xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState == 4) 
      if (xmlhttp.status == 200) { 
       alert(xmlhttp.responseText); 
      } else { 
       // status ≠ 200, output useful error message 
      } 
    }; 
    xmlhttp.send(); 
} 
+0

我会试试这个 – koool 2011-05-22 23:28:56

我已经做了一个类(你可以很容易地修改)在循环中调用一个函数,它会正确调用函数。也许这可能适用于您的需求。

(此外,如果有人看到的东西错了,它是很好的聆听他人意见)

TEST.HTM

<html> 
<head> 
<script type="text/javascript"> 
function myXmlHttp() { 

    /*constructor simulator*/ 
    this.setPersitent= 
    function (file, onReadyFunc,params,loop) 
    { 
     myXmlHttpObj.loop = loop; 
     myXmlHttpObj.file=file; 
     myXmlHttpObj.onReadyFunc='myXmlHttpObj.'+onReadyFunc; 
     myXmlHttpObj.params=params; 
     myXmlHttpObj.mySetRequest();  
    } 
    this.setParams= 
    function (params) 
    { 
     myXmlHttpObj.params=params; 
    } 

    <!--Standard initial code--> 
    this.mySetRequest = 
    function () 
    { 
     request = false; 
     try { request = new XMLHttpRequest(); } 
     catch (trymicrosoft) { 
      try { request = new ActiveXObject("Msxml2.XMLHTTP"); } 
      catch (othermicrosoft) { 
       try {request = new ActiveXObject("Microsoft.XMLHTTP");} 
       catch (failed) {request = false;}/*catch3*/}/*catch2*/}/*catch1*/ 
     if (!request) 
     alert("Error initializing XMLHttpRequest!"); 
    } /*func*/ 

    this.mySendReq= 
    function() 
    { 
     var url = myXmlHttpObj.file; 
     request.open("POST", url, true); 
     //Some http headers must be set along with any POST request. 
     request.setRequestHeader 
     ("Content-type", "application/x-www-form-urlencoded;charset=utf-8"); 
     request.setRequestHeader("Content-length", myXmlHttpObj.params.length); 
     request.setRequestHeader("Connection", "close"); 
     request.onreadystatechange = eval(myXmlHttpObj.onReadyFunc); 
     request.send(myXmlHttpObj.params); 
    } 

    this.listenPHP = 
    function () {  
    if (request.readyState == 4) { 
     if (request.status == 200) 
     { 
      alert(request.responseText); 
      myXmlHttpObj.loop--; 
      if(myXmlHttpObj.loop>0) 
      { 
       myXmlHttpObj.setParams("js_rand="+Math.random()+""); 
       myXmlHttpObj.mySendReq(); 
      } 

     }//inner if 
     else{alert("status is " + request.status);} 
    }//outer iff 
    }//function 

}//END 

myXmlHttpObj = new myXmlHttp(); 
myXmlHttpObj.setPersitent 
('getresponse.php', 'listenPHP',"js_rand="+Math.random()+"",3) ; 

myXmlHttpObj.mySendReq(); 

</script> 
</head> 
<body > 

</body> 
</html> 

getresponse.php

<?PHP 
echo 'I recived this random from js:',$_POST['js_rand'],' 
this rand is from php:',rand(1,9999); 
?>