2011-09-14 219 views
0

我在写一个需要执行一些并行Ajax请求的脚本。我正在使用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:srry关于西班牙语变量的名称;

+1

这个问题被问过所有的时间。看到http://www.erichynds.com/jquery/using-deferreds-in-jquery/ – hvgotcodes

+0

你不使用jquery,但如果你是,这可能会帮助:http://api.jquery.com/ajaxStop/ – Robin

+0

srry即时通讯新的javascript/ajax和现在即时通讯不使用jQuery。你能帮我一些代码吗? – Gustavo

回答

0

您已经知道限制为20,无需每次使用此limit = i;来增加限制。

只需设置

var limit = 20; 

在你的脚本的开头。

这可能是实际需要来设置一个限制值以下(19在这种情况下),由于从0开始

此外阵列,每次完成一个AJAX请求时间加上这一行:

console.log('ready = ' + ready); 

通过这种方式,您可以真正看到准备停止的价值,还是根本没有增加价值。

+0

感谢您的console.log()。不知道这个,就像我刚刚说的那样。所以结果是非常不一致的,因为有时候准备到达23 O_O,而其他准备到达2。另外,var limit = 1是因为有时候campo是空的,当它发生时它停止。 – Gustavo

0

你的onreadystatechange函数中的索引值不会是你所期望的。

与建议替换当前的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); 
+0

谢谢生病尝试并发回 – Gustavo