2010-10-17 26 views
14

weiterhin fertig Ich habe einige Ajax-Aufrufe in meinem document.ready()jquery: warten, bis alle Ajax-Aufrufe dann

wie:

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 

Wie ich es erzwingen kann weiterhin warten und nicht, bis wir Bekomme alle Rückrufe von den Ajax-Anfragen?

+0

hier meine andere Antwort Siehe: http://stackoverflow.com/a/11315571/49885 ist ajaxStop, was Sie wollen, ist seine eingebaute seit jquery 1.0 –

Antwort

16

Ich mag keine Antwort auf alle, die beste Art und Weise (seit JQuery 1.5+) ist Latente Objekte zu verwenden, diejenigen Objekte sind Asynchron-Anrufe zu manipulieren Auf diese Weise myFunc ausführt, nachdem die 2 ajax-Aufrufe gemacht werden, und myFailure wenn ein einen Fehler

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

haben: Sie können lösen.

Sie können mehr darüber in der jquery offiziellen Dokumentation lesen: JQuery Deferred Object

Ich schreibe diese Lösung, wenn jemand diesen Beitrag sieht es hilfreich sein kann.

Leider mein Englisch: P

+1

Wie immer Sie sie nennen - aufgeschobene Objekte, Versprechen, etc. - diese scheinen mir eine viel bessere Lösung als parallele Schleifen zu sein –

1

Sie können Sucess verwenden (dh eine Callback-Funktion von Ajax jquery) wie unten:

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

Sie können unter Dokumentation von Ajax erhalten -

ajax

+0

Wie kann ich es in meinem Code? –

+1

@Haim Evgi: Verschieben Sie den Code, den Sie nach dem Anruf haben und den Sie ausführen möchten, nachdem der Anruf im Rückruf beendet wurde. –

+0

Ich habe meinen Code gemäß Ihrer Anforderung bearbeitet. Sie können Ajax anstelle von getjson wie oben beschrieben verwenden. – Alpesh

6

First off, möchten Sie vielleicht in Erwägung ziehen, den Startup-Code in einem einzigen Aufruf auszuführen.
Zweitens: Anstatt zu warten, rufen Sie einfach einen anderen Funktionsaufruf an.

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) 
} 

oder Trigger: Für den oben stehenden Code sollte es so etwas wie aussehen

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

Danke, das hat wunderbar für mich funktioniert.(das auslösende initdone) – tsdexter

+0

Ich versuchte async: falsch und hatte immer noch Probleme. Die Lösung, die sendende Funktion in Ajax aufzurufen, war perfekt. Vielen Dank! –

3

Es war nicht einfach für mich, es zu tun, aber Sie vielleicht meinen Code nützlich finden. Es ist ein Prozess, um alle Formulare in der Dom einzureichen und nachdem sie alle gespeichert sind, leite den Benutzer auf eine andere Seite um.

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

Das Problem mit so etwas wie if (j == 7) ist die Situation, wenn die siebte Anforderung sehr sehr schnell, und auch einer der anderen ist langsam. Auch wenn Sie es zuletzt in die Warteschlange gestellt haben, ist es möglicherweise nicht das letzte, das abgeschlossen wird.

Diese Antwort scheint für alle Bedingungen zu arbeiten: https://stackoverflow.com/a/3709809/813154

Verwandte Themen