2012-04-09 74 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