我正在编写一个需要执行一些并行的ajax请求的脚本。我正在使用ajax数组但我希望在所有请求完成后执行一些代码(使一些标记可见)。这是代码,希望你能帮助我。
function Update_All(){
var loading = document.getElementById("loading_image");
var actualizacion_completa = document.getElementById("actualizacion_completa");
loading.style.display = "";
actualizacion_completa.style.display = "none";
var i=1;
var ajax= new Array(20);//objetoAjax();
var limit = 1;
var ready = 1;
for (i=1;i<=20;i++)
{
var index = i-1;
ajax[index] = objetoAjax();
var voatencion = document.getElementById("idatencionf"+i);
var vohoras = document.getElementById("vhorasf"+i);
var vtarifa = document.getElementById("tarifaclientef"+i);
var voexonerado = document.getElementById("vexoneradof"+i);
var voaprobado = document.getElementById("vaprobadof"+i);
var campo = document.getElementById("f"+i+"c1");
if(typeof(campo) != 'undefined' && campo != null){
var valor = 1;
if(campo.innerHTML=="Si") valor = 2;
ajax[index].open("GET","update.php?atencion="+voatencion+"&opc="+5+"&valor="+valor+"&exonerado="+voexonerado.value+"&tarifa="+vtarifa.value+"&horas="+vohoras.value);
ajax[index].send(null);
limit = i;
ajax[index].onreadystatechange=function() {
if (ajax[index].readyState==4 && ajax[index].status == 200) {
ready++;
if(ready == limit){
loading.style.display = "none";
actualizacion_completa.style.display = "";
}
}
}
}
else{
break;
}
}
}
问题已经准备好永远不会等于限制。
PS:关于西班牙变量的名字;
答案 0 :(得分:0)
您已经知道限制为20,无需每次使用此limit = i;
进行扩充。
只需设置
var limit = 20;
在剧本的开头。
由于数组以0开头,实际上可能需要为限制设置一个较小的值(在本例中为19)。
此外,每次完成AJAX请求时都要添加此行:
console.log('ready = ' + ready);
通过这种方式,您实际上可以看到准备好的值正在停止,或者它是否完全没有增加。
答案 1 :(得分:0)
你的onreadystatechange函数中的index值将不是你所期望的。
建议用以下内容替换当前的onreadystatechange:
(function(ajaxItem, ready) {
ajaxItem.onreadystatechange = function() {
if (ajaxItem.readyState==4 && ajaxItem.status == 200) {
ready++;
if(ready == limit){
loading.style.display = "none";
actualizacion_completa.style.display = "";
}
}
})(ajax[index], ready);