2010-10-17 11 views
14

Tengo algunas llamadas Ajax en mi document.ready()jQuery: esperar hasta que todas las llamadas ajax terminan luego continuar

como:

for (j=1; j <= 7; j++){ 
    (function(index) { 
    $.getJSON('my.php', {id:index}, 
     function(data) { 
     $.each(data, function(index2, array){ 
     ........ 
     }); 
     }); 
    })(j) 
} 

//DO NOT CONTINUE UNTIL FINISH AJAX CALLS 

........ 
MORE JQUERY CODE 

Cómo puedo obligarlo a esperar y no continuará hasta que obtener todas las llamadas devueltas de las solicitudes ajax?

+0

ver mi otra respuesta aquí: http://stackoverflow.com/a/11315571/49885, ajaxStop es lo que desea, su acaba de abrirse desde jQuery 1.0 –

Respuesta

16

no me gusta ninguna respuesta en absoluto, la mejor manera (ya jQuery 1.5 +) es utilizar objetos diferidos, son objetos para manipular las llamadas asíncronas , puede resolver:

$.when($.ajax("/page1.php"), $.ajax("/page2.php")) 
    .then(myFunc, myFailure); 

de esta manera myFunc ejecuta después de realizar las llamadas ajax 2, y myFailure si uno tiene un error.

Usted puede leer más sobre esto en la documentación oficial de jQuery: JQuery Deferred Object

escribo esta solución si alguien ve este post puede ser útil.

Lo siento mi Inglés: P

+1

Como llames, objetos diferidos, promesas, etc., me parecen una solución mucho mejor que los bucles paralelos –

1

puede utilizar éxito (es decir, una función de devolución de llamada de Ajax jQuery), como a continuación:

$.ajax({ 
    url: url, 
dataType: 'json', 
data: data, 
success: function(data){ 
//Write your code here. 
    } 
}); 

Usted puede obtener la documentación de ajax abajo -

ajax

+0

¿Cómo puedo usar en mi código? –

+1

@Haim Evgi: Mueva el código que tiene después de la llamada y que desea ejecutar después de que la llamada finalizó dentro de la devolución de llamada. –

+0

He editado mi código según su requisito. Puede usar ajax en lugar de getjson como se describe arriba. – Alpesh

6

En primer lugar, es posible que desee considerar la posibilidad de hacer el código de inicio en una sola llamada.
Segundo: En lugar de esperar solo llame a otra función. para el código de seguridad que debe ser algo como:

for (j=1; j <= 7; j++){ 
    (function(index) { 
    $.getJSON('my.php', {id:index}, 
     function(data) { 
     $.each(data, function(index2, array){ 
     ........ 
     }); 

     if (j === 7) { 
      initDoneDoMoreStuff() 
     } 
     }); 
    })(j) 
} 

o disparador:

for (j=1; j <= 7; j++){ 
    (function(index) { 
    $.getJSON('my.php', {id:index}, 
     function(data) { 
     $.each(data, function(index2, array){ 
     ........ 
     }); 

     if (j === 7) { 
      $(document).trigger("initdone"); 
     } 
     }); 
    })(j) 
} 

$(document).bind("initdone", function() {....}); 
+0

Gracias, esto funcionó maravillosamente para mí.(el initdone desencadenante) – tsdexter

+0

Intenté async: falso y todavía tenía problemas. La solución para llamar a la función de envío dentro de ajax fue perfecta. ¡Gracias! –

3

no lo era fácil para que lo haga, pero tal vez encontrar mi código útil. Es un proceso para enviar todas las formas en el dom y después de que todas estén almacenadas, redirija al usuario a otra página.

formulario = $('form'); 
formulariolongitud = formulario.length; 
i = 0; 

formulario.each(function(index, value) { 
    $(this).ajaxSubmit({ 
     async: false,//not sure i 
     success: function() { 
      i++; 

      if(i === formulario.length) {//this is the last one to submit 
       window.location.replace(whatever); 
      } 
     } 
    });       
}); 
0

El problema con algo así como si (j == 7) es la situación cuando la séptima petición es muy muy rápido, e incluso uno de los otros es lento. A pesar de que lo has puesto en cola el último, puede que no sea el último en completarse.

Esta respuesta parece funcionar para todas las condiciones: https://stackoverflow.com/a/3709809/813154

Cuestiones relacionadas