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

} 

(Modificata molto, in quanto è parte di una classe ecc ecc)Firing richiamata dopo molteplici richieste Ajax sono completi

Al momento questo si sente un po 'hacker, come l'uso del timer sembra spazzatura. Vorrei usare $ .when e $ .done, ma non so quante stanze ci potrebbero essere, quindi non so cosa mettere quando.

Come faccio a garantire che run_the_rest_of_the_app() venga chiamato solo una volta che tutte le richieste AJAX vengono restituite?

risposta

19
  • var activeAJAX = 0;

  • Prima di effettuare una chiamata AJAX, activeAJAX++;

  • Dopo aver completato una chiamata AJAX (nella callback): if (--activeAJAX == 0) { allDone(); }

+2

+1 molto elegante –

4

Ecco come utilizzare quando/fatto

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

Stranamente questo non funziona nei miei test. il bit eseguito si attiva prima che le richieste vengano eseguite abbastanza spesso. Dispari. –

+0

Hmm .. mi chiedo se stiamo osservando una condizione di competizione tra i singoli callback "success" e il callback "done" del gruppo. Le richieste non sono davvero fatte? o semplicemente il loro callback non viene chiamato quando viene eseguito il callback 'done'? –

+0

Ne ho anche uno in più prima di $ .each, quindi è possibile che quello venga completato prima che venga attivato il primo $ .getJSON? Strano. Alla fine sono rimasto con la mia versione del timer spazzatura, perché volevo una barra di stato, e ha reso tutto più facile! –