2012-04-09 35 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) 

} 

(Modified rất nhiều, vì nó là một phần của một lớp học vv vv)Firing gọi lại sau nhiều lần yêu cầu ajax được hoàn thành

Tại thời điểm này cảm thấy một chút hackish, như việc sử dụng bộ đếm thời gian dường như rác. Tôi sẽ sử dụng $ .when và $ .done, nhưng tôi không biết có bao nhiêu phòng có thể, vì vậy tôi không biết phải đưa vào thời điểm nào.

Làm cách nào để đảm bảo rằng run_the_rest_of_the_app() chỉ được gọi khi tất cả yêu cầu AJAX trở lại?

Trả lời

19
  • var activeAJAX = 0;

  • Trước khi thực hiện một cuộc gọi AJAX, activeAJAX++;

  • Sau khi hoàn thành một cuộc gọi AJAX (trong callback): if (--activeAJAX == 0) { allDone(); }

+2

+1 rất thanh lịch –

4

Dưới đây là làm thế nào để sử dụng khi/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

Điều kỳ lạ này không hiệu quả trong thử nghiệm của tôi. các bit được thực hiện trước khi các yêu cầu được thực hiện khá thường xuyên. Odd. –

+0

Hmm .. tôi tự hỏi liệu chúng ta có đang nhìn thấy một điều kiện cuộc đua giữa các callbacks 'success' cá nhân và gọi lại' done' của nhóm hay không. Các yêu cầu có thực sự không được thực hiện? hoặc chỉ gọi lại của họ không được gọi khi gọi 'done' được thực hiện? –

+0

Tôi cũng có một phần bổ sung trước $ .each, do đó, nó có thể là cái đó hoàn thành trước $ .getJSON đầu tiên được kích hoạt? Kỳ dị. Cuối cùng tôi ở lại với phiên bản hẹn giờ rác của tôi, như tôi muốn một thanh trạng thái, và nó làm cho nó dễ dàng để làm! –

Các vấn đề liên quan