Javascript 在列表中循环时调用XMLHttpRequest()

Javascript 在列表中循环时调用XMLHttpRequest(),javascript,ajax,Javascript,Ajax,我第一次尝试AJAX,结果证明它和预期的一样令人恼火。我有一个例程,它提取一个JSON数组,在perl中我称之为哈希,表示要检查的网站列表。它在这个列表中循环绘制一个表,然后调用第二个cgi脚本依次检查每个网站,并用结果更新表中的一个单元格。下面是在firefox中实际运行的函数 function loadDoc() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (th

我第一次尝试AJAX,结果证明它和预期的一样令人恼火。我有一个例程,它提取一个JSON数组,在perl中我称之为哈希,表示要检查的网站列表。它在这个列表中循环绘制一个表,然后调用第二个cgi脚本依次检查每个网站,并用结果更新表中的一个单元格。下面是在firefox中实际运行的函数

function loadDoc() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
     var table="<table><tr><th>Site</th><th>Result</th></tr>";
     var json = JSON.parse(this.responseText);// here data is your response
    for (var key in json) {
     table += "<tr><td>" + json[key].name + "</td><td id=" + json[key].i + ">Pending</td></tr>";
   }
   table += "</table>";
   document.getElementById("rtable").innerHTML = table;
   for (var key in json) {
    var request = new XMLHttpRequest();
    var rstring = "testsite.cgi?platform=" + document.getElementById("platform").value + "&username=" + document.getElementById("username").value;
    rstring += "&type=" + document.getElementById("type").value + "&i=" + json[key].i
    request.open("GET", rstring,false);
    request.send();
    document.getElementById(json[key].i).innerHTML = request.responseText;
    }
   }
 };
  xhttp.open("POST", "ajaxtest.cgi");
  var myForm = document.getElementById("myForm");
  var formData = new FormData(myForm);
  xhttp.send(formData);
}
函数loadDoc(){
var xhttp=newXMLHttpRequest();
xhttp.onreadystatechange=函数(){
if(this.readyState==4&&this.status==200){
var table=“SiteResult”;
var json=json.parse(this.responseText);//这里的数据是您的响应
for(json中的var键){
表+=“”+json[key]。名称+“待定”;
}
表+=”;
document.getElementById(“rtable”).innerHTML=表格;
for(json中的var键){
var request=new XMLHttpRequest();
var rstring=“testsite.cgi?platform=“+document.getElementById(“platform”).value+”&username=“+document.getElementById(“username”).value;
rstring+=“&type=“+document.getElementById(“type”).value+”&i=“+json[key].i
打开(“获取”,rstring,false);
request.send();
document.getElementById(json[key].i).innerHTML=request.responseText;
}
}
};
xhttp.open(“POST”,“ajaxtest.cgi”);
var myForm=document.getElementById(“myForm”);
var formData=新formData(myForm);
xhttp.send(formData);
}

问题是,在chrome中,它直到第二个循环完成后才绘制表格,所以整个页面只会挂起一分钟左右。在firefox中也是如此,但至少你可以看到发生的事情。当我尝试进行第二次异步调用时,什么都没有发生。在第一次尝试时,我尝试执行与第一次相同的第二次调用,并在循环中设置request.onreadystatechange()函数,但这只是为每次调用更新了表的最后一个单元格。我错过了什么?我知道使用同步调用是不好的,但我更愿意一次检查一个结果,而不是用20个并发请求来攻击我的服务器,尽管理想情况下,它会一次运行4-5个测试,并在第一批测试完成后开始第二批测试

你能递归地而不是在循环中调用AJAX吗?下一次调用将在第一次返回后发生。