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