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) 

} 

(Modificado mucho, ya que es parte de una clase, etc, etc)Firing devolución de llamada después de múltiples peticiones Ajax es completa

En el momento en que esto se siente un poco hacker, como el uso del temporizador parece basura. Yo usaría $ .when y $ .done, pero no sé cuántas salas podría haber, así que no sé qué poner cuando.

¿Cómo me aseguro de que run_the_rest_of_the_app() solo reciba una llamada una vez que todas las solicitudes AJAX vuelvan?

Respuesta

19
  • var activeAJAX = 0;

  • Antes de hacer una llamada AJAX, activeAJAX++;

  • Después de completar una llamada AJAX (en la devolución de llamada): if (--activeAJAX == 0) { allDone(); }

+2

+1 muy elegante –

4

Aquí es cómo utilizar cuando/hecho

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

Extrañamente, esto no funciona en mi prueba. el bit listo se dispara antes de que las solicitudes se realicen con bastante frecuencia. Impar. –

+0

Hmm .. me pregunto si estamos viendo una condición de carrera entre las devoluciones de llamada de 'éxito' individuales y la devolución de llamada 'done' del grupo. ¿Las solicitudes realmente no están hechas? ¿o simplemente no se llama a su devolución de llamada cuando se ejecuta la devolución de llamada 'done'? –

+0

También tengo uno adicional antes del $ .each, ¿entonces es posible que ese se complete antes de que se active el primer $ .getJSON? Extraño. Al final me quedé con mi versión del temporizador de basura, ya que quería una barra de estado, ¡y eso hizo que fuera fácil de hacer! –

Cuestiones relacionadas