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

} 

(Zmodyfikowana dużo, jak to część klasy itp itd)Wypalanie zwrotna po wielokrotnych żądań AJAX są kompletne

W tej chwili czuje się trochę hackish, jak użycie timera wydaje śmieci. Używałbym $ .when i $ .done, ale nie wiem, ile pokoi może tam być, więc nie wiem, w co się włożyć, kiedy.

Jak zapewnić, że funkcja run_the_rest_of_the_app() zostanie wywołana tylko po otrzymaniu wszystkich żądań AJAX?

Odpowiedz

19
  • var activeAJAX = 0;

  • Przed dokonaniem wywołanie AJAX, activeAJAX++;

  • Po zakończeniu wywołanie AJAX (w zwrotnego): if (--activeAJAX == 0) { allDone(); }

+2

+1 bardzo elegancki –

4

Oto jak korzystać podczas/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

Dziwnie to nie działa w moich testach. gotowy bit jest uruchamiany, zanim żądania zostaną wykonane dość często. Dziwny. –

+0

Hmm .. Zastanawiam się, czy widzimy stan wyścigu między poszczególnymi callbackami "powodzenia" i "wykonanym" oddzwanianiem grupy. Czy prośby naprawdę nie zostały wykonane? lub po prostu wywołanie zwrotne nie jest wywoływane, gdy wykonywane jest wywołanie zwrotne 'done'? –

+0

Mam również jeden dodatkowy przed $ .each, więc może być tak, że jeden do ukończenia przed uruchomieniem pierwszego .getJSON? Dziwne. W końcu zostałem z moją wersją czasomierza na śmieci, ponieważ chciałem pasku stanu i to było łatwe! –

Powiązane problemy