2013-06-19 55 views
0

我有一個包含ajax請求的for循環。請求正在異步工作。所以我無法及時達到請求的結果。我怎樣才能解決這個問題,而不使用任何庫? 謝謝。所有的ajax在一個循環中的同步請求

var availables = document.getElementsByClassName("available"); 

    for(var i=0;i<availables.length;i++){ 
     var element = availables[i]; 

     var xmlhttp; 
     if(window.XMLHttpRequest) 
      xmlhttp = new XMLHttpRequest; 
     else 
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 

     xmlhttp.open("GET", "control.php?user=" + element.innerText, true); 
     xmlhttp.send(); 

     xmlhttp.onreadystatechange = function(){ 
      if(xmlhttp.readyState == 4 && xmlhttp.status == 200){ 
       var result = xmlhttp.responseText; 
       console.log(result); 

       element.setAttribute("class" , "result available " + result); 
       if(result == "online") 
        element.innerHTML = "<a href=\"http://twitter.com/" + element.innerText + "\">" + element.innerText + "</a>"; 
      } 
     } 
    } 
+0

那麼問題是什麼?爲什麼你會異步處理響應? –

回答

2

首先,我建議把你的xmlhttp.onreadystatechange功能你做xmlhttp.open和xmlhttp.send之前。它可能是發送和返回的,並且由於它是異步運行的,所以它可以在您定義/執行onreadystatechange函數之前回退。類似的東西。

無論如何,您始終可以通過將xmlhttp.open中的最後一個參數設置爲false來同步執行所有操作。這會使xmlhttp.send在繼續之前等待javascript,但無論哪種方式,在打開和發送之前,仍然需要放置onreadystatechange。

var availables = document.getElementsByClassName("available"); 

for(var i=0;i<availables.length;i++){ 
    var element = availables[i]; 

    var xmlhttp; 
    if(window.XMLHttpRequest) 
     xmlhttp = new XMLHttpRequest; 
    else 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 

    xmlhttp.onreadystatechange = function(){ 
     if(xmlhttp.readyState == 4 && xmlhttp.status == 200){ 
      var result = xmlhttp.responseText; 
      console.log(result); 

      element.setAttribute("class" , "result available " + result); 
      if(result == "online") 
       element.innerHTML = "<a href=\"http://twitter.com/" + element.innerText + "\">" + element.innerText + "</a>"; 
     } 
    } 

    xmlhttp.open("GET", "control.php?user=" + element.innerText, true); 
    //xmlhttp.open("GET", "control.php?user=" + element.innerText, false); //If you want to do it synchronously 
    xmlhttp.send(); 
} 
0

這是非常不好的做法,讓您的AJAX調用同步xmlhttp.open("GET", "control.php?user=" + element.innerText, true)因爲直到一個Ajax請求結束,你不能與你的應用程序進行交互。我認爲在你的情況下,最好在onreadystatechange回調前發送下一個請求。