2010-10-17 30 views
14

ho alcune chiamate Ajax nel mio document.ready()jquery: attendere che tutte le chiamate Ajax finiscono poi continuare

come:

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 

Come posso forzarlo ad aspettare e non continuare fino a quando abbiamo ricevere tutte le richiamate dalle richieste Ajax?

+0

vedere la mia altra risposta qui: http://stackoverflow.com/a/11315571/49885, ajaxStop è ciò che si vuole, il suo stato costruito in fin jQuery 1.0 –

risposta

16

non mi piace alcuna risposta a tutti, il modo migliore (dal Jquery 1.5+) è quello di utilizzare gli oggetti anticipate, quelli sono gli oggetti per manipolare le chiamate asincrone , è possibile risolvere:

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

In questo modo myFunc eseguito dopo le chiamate ajax 2 sono fatte, e myFailure se uno ha un errore.

Si può leggere di più su di esso nella documentazione ufficiale di jQuery: JQuery Deferred Object

Scrivo questa soluzione se qualcuno vede questo post può essere utile.

dispiace il mio inglese: P

+1

Qualunque cosa tu li chiami - oggetti differiti, promesse, ecc. - quelli mi sembrano una soluzione molto migliore di loop paralleli per me –

1

è possibile utilizzare sucesso (cioè una funzione di callback di ajax jquery) come di seguito:

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

È possibile ottenere la documentazione di Ajax qui sotto -

ajax

+0

come posso usare nel mio codice? –

+1

@Haim Evgi: sposta il codice che hai dopo la chiamata e desideri eseguirlo dopo che la chiamata è terminata all'interno della richiamata. –

+0

Ho modificato il mio codice secondo il vostro requisito. Puoi usare ajax invece di getjson come descritto sopra. – Alpesh

6

Prima di tutto, si potrebbe desiderare considerare di fare il codice di avvio in una singola chiamata.
Secondo: Invece di aspettare, basta chiamare un'altra chiamata di funzione. per il codice di cui sopra dovrebbe essere simile:

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 un trigger:

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

Grazie, ha funzionato magnificamente per me.(initdone triggering) – tsdexter

+0

Ho provato async: false e ho ancora avuto problemi. La soluzione per chiamare la funzione di invio all'interno di ajax era perfetta. Grazie! –

3

non't facile per me farlo, ma forse trovare il mio codice utile. È un processo per inviare tutti i moduli nella dom e dopo averli memorizzati, reindirizzare l'utente a un'altra pagina.

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

Il problema con qualcosa come if (j == 7) è la situazione in cui il 7 ° richiesta è molto molto veloce, e anche uno degli altri è lento. Anche se lo hai accodato per ultimo, potrebbe non essere l'ultimo da completare.

Questa risposta sembra funzionare per tutte le condizioni: https://stackoverflow.com/a/3709809/813154

Problemi correlati