2012-06-17 22 views
0

所以這裏是問題所在:Javascript for loop比AJAX呼叫更快

我正在爲每個帖子循環播放AJAX。這個想法是從ajax調用中獲得一個True或False。但我認爲循環速度快於ajax調用,我只能得到一個結果。這個結果也適用於其他帖子,所以我沒有爲其他帖子弄虛作假,而是得到了真實的結果。有沒有一種方法可以讓循環等到ajax調用完成?異步:

function changMonth(month, active, url){ 
$('#eventTimeline').empty(); 

$('#month1, #month2, #month3, #month4, #month5, #month6, #month7, #month8, #month9, #month10, #month11, #month12').removeAttr('class'); 

$(active).attr('class', 'active'); 

base_url = $('#base_register').val(); 
user_id = $('#user_id').val(); 

$.post(url, {'month': month} , function(data){ 

    for(var i = 0; i < data.length; i++) 
    { 
     var splitDateString = new String(data[i].event_date); 
     var splitDateArray = splitDateString.split('-'); 

     $.post(base_url + '/searchFilter/getRegisteredParents', {'event_id' : data[i].event_id}, function(data2){ 

      checkboolean = data2.check; 
      ajaxFinnish = true; 

     }, "json"); 

     if(ajaxFinnish == true) 
     { 

     $('#eventTimeline').append(

      '<div class="post' + i + '">' + 
      '<h3>' + data[i].event_name + '</h3>' + 
      '<div class="eventImage"><img width="113px" height="113px" src="' + data[i].event_photo + '" alt="&nbsp;" /></div>' + 
      '<div class="eventText">' + data[i].event_details + '</div>' + 
      '<div class="klas"><span>' + splitDateArray[2] + ' ' + maandArr[splitDateArray[1]] + '</span>' + data[i].group + '</div>' + 
      '</div>' 

     ); 

     $(".post" + i).css({'width': '605px', 'background-color': '#FFFFFF', 'border-bottom': 'solid 1px #4c585e', 'margin': '10px 5px 5px 5px', 'overflow': 'hidden' }); 


      if(checkboolean == "true") 
      { 
       //console.log('TRUE'); 
       $(".post" + i).append('<a href="#" class="eventMore">Uitschrijven</a>'); 
      } 
      else 
      { 
       //console.log('False'); 
       $(".post" + i).append('<a href="#" class="eventMore">Inschrijven</a>'); 
      } 
      ajaxFinnish = false; 
     } 


     console.log(checkboolean); 
    } 

}, "json");} 
+0

HOLY CRAP! **異步** JavaScript和XML == ** AJAX **。您剛剛獲得了轉發器徽章,以再次詢問舊的10000問題。我們可以將這個問題作爲這些問題之一的重複來解決(http://stackoverflow.com/search?q=return+from+ajax+callback)ARGGG! – gdoron

回答

1

沒有在你的代碼中尋找細節,我可以通過你的描述,這是發生的原因是因爲Ajax中的一個已經告訴你。

您的AJAX調用會對您的服務器進行調用,當它這樣做時,其餘代碼將繼續運行。正因爲如此,您的JS幾乎總是會在您的AJAX調用之前完成。你需要做的是在你的.done()函數中實現回調。使用回調是確保代碼以您希望的順序運行的唯一可靠方法:

function myCallback(response) { 
    console.log(response); 
} 

function myAjaxCall(myUrl, myData) { 
    $.ajax(myUrl, {data: myData }).done(myCallback); 
} 
0

您無法進行for循環等待。在這種情況下最好的做法是使用setTimeout來調用初始ajax,並且對於後續的每次調用,您都會進行相同的setTimeout調用。

+1

沒有辦法。像whoa這樣的競賽條件。你需要使用回調 – Jason