2011-09-14 177 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