2012-04-09 67 views
9
loadInfo: function(){ 
    var jsonCounter = 0, 
    room = ['room1','room2','room3'], 
    dates = [], 
    prices = [] 

    $.each(booking.rooms, function(key, room_name) { 
     $.getJSON('/get_info.php?room='+room_name, function(data) { 
      dates[room_name] = data 
      jsonCounter++ 
     }) 
     $.getJSON('/get_info.php?room='+room_name+'&prices', function(data) { 
      prices[room_name] = data 
      jsonCounter++ 
     }) 

    }) 

    function checkIfReady() { 
     if (jsonCounter === rooms.length * 2) { 
      clearInterval(timer) 
      run_the_rest_of_the_app() 
     } 
    } 

    var timer = setInterval(checkIfReady, 100) 

} 

(修改了很多,因爲它是一個類等等等等的一部分)觸發回調完成

這感覺有點hackish的那一刻,作爲定時器的使用似乎垃圾。我會使用$ .when和$ .done,但我不知道可能有多少個房間,所以我不知道該在什麼時候放入。

如何確保run_the_rest_of_the_app()僅在所有AJAX請求返回後才被調用?

回答

19
  • var activeAJAX = 0;

  • 使得AJAX調用之前,activeAJAX++;

  • 完成一個AJAX調用(回調)後:if (--activeAJAX == 0) { allDone(); }

+2

+1非常優雅 – 2012-04-09 15:31:55

4

這裏是如何使用的時候/ done

loadInfo: function(){ 
    var room = ['room1','room2','room3'], 
    dates = [], 
    prices = [], 
    requests = []; 

    $.each(booking.rooms, function(key, room_name) { 
     var aRequest; 

     aRequest = $.getJSON('/get_info.php?room='+room_name, function(data) { 
      dates[room_name] = data; 
     }); 
     requests.push(aRequest); 

     aRequest = $.getJSON('/get_info.php?room='+room_name+'&prices', function(data) { 
      prices[room_name] = data; 
     }); 
     requests.push(aRequest); 

    }) 

    $.when.apply($, requests).done(run_the_rest_of_the_app); 
} 
+0

奇怪的是這在我的測試中不起作用。在請求完成之前,完成位會觸發。奇。 – 2012-04-09 16:29:45

+0

嗯..我想知道如果我們看到個人'成功'回調和'完成'回調組之間的競爭條件。請求是否真的沒有完成?或者只有當'done'回調被執行時他們的回調纔會被調用? – 2012-04-09 16:45:55

+0

我在$ .each之前還有一個額外的,所以它可能是在第一個$ .getJSON被觸發之前完成的。奇怪的。最後,我留下了我的垃圾計時器版本,因爲我想要一個狀態欄,這使得它很容易做到! – 2012-04-09 17:33:54

相關問題