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

} 

(viel modifiziert, wie es Teil einer Klasse ist etc etc.)Firing Rückruf nach mehreren AJAX-Anfragen vollständig

Im Moment fühlt sich das ein bisschen hackish, wie die Timer Nutzung Müll scheint. Ich würde $ .when und $ .done benutzen, aber ich weiß nicht, wie viele Zimmer es gibt, also weiß ich nicht, wo ich es hinkriegen sollte.

Wie stelle ich sicher, dass run_the_rest_of_the_app() erst aufgerufen wird, wenn alle AJAX-Anfragen zurückkommen?

Antwort

19
  • var activeAJAX = 0;

  • Bevor ein AJAX-Aufruf zu machen, activeAJAX++;

  • Nach einem AJAX-Aufruf Abschluss (in der Callback): if (--activeAJAX == 0) { allDone(); }

+2

+1 sehr elegant –

4

Hier ist, wie wenn zu verwenden/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

Komisch funktioniert das nicht in meinen Tests. Das Done-Bit wird ausgelöst, bevor die Anforderungen relativ häufig ausgeführt werden. Ungerade. –

+0

Hmm .. ich frage mich, ob wir eine Race Condition zwischen den einzelnen 'Erfolg' Callbacks und dem' Done' Callback der Gruppe sehen. Sind die Anfragen wirklich nicht erledigt? oder nur ihr Callback wird nicht aufgerufen, wenn der 'Fertig'-Callback ausgeführt wird? –

+0

Ich habe auch eine extra vor dem $ .each, also kann es sein, dass diese abgeschlossen wird, bevor das erste $ .getJSON ausgelöst wird? Seltsam. Am Ende blieb ich bei meiner Müll-Timer-Version, da ich eine Statusleiste wollte, und das machte es einfach! –