Mehrere Ajax-Aufrufe innerhalb einer each () -Funktion. Dann etwas tun, sobald ALLE fertig sind?

8

Lassen Sie mich meinen Code ein wenig erklären (Entschuldigung, wenn etwas falsch ist, ich habe dieses Beispiel nur von Grund auf neu geschrieben, es ist sehr nah an dem, was ich gerade habe).

HTML:

%Vor%

JS:

%Vor%

JSFiddle (Umleitung entfernt und Ajax-Aufruf durch Konsolenprotokoll für Geige ersetzt) ​​

Ссылка

Der HTML-Code ist ein einfaches Formular mit den Eingabefeldern für die E-Mail-Adressen der Freunde und Freunde.

Der JS hat eine jede Funktion, die, wenn der Name und die zugehörige E-Mail Werte haben, einen Ajax-Aufruf ausführt.

Ich brauche einen Weg, damit diese Ajax-Aufrufe ausgeführt werden (es könnte 1 Schleife geben, es könnten 15 sein) und dann, nachdem alle fertig sind, umleiten zu einer neuen Seite.

Die derzeitige Art, wie ich es mache, ist schrecklich, da alle Ajax-Aufrufe nicht beendet werden, bevor die Seite umgeleitet wird.

Was kann ich tun, um das besser zu machen? Es muss narrensicher sein und NUR umleiten, sobald alle Ajax-Aufrufe beendet sind (Erfolg oder Fehler, es spielt keine Rolle - es muss nur umgeleitet werden, sobald es fertig ist).

Ich habe versucht, async: false zu verwenden, aber es scheint keinen Unterschied zu machen.

Ich habe darüber nachgedacht, einen Zähler in jede Funktion und einen Zähler in der Ajax-Erfolgsfunktion zu setzen, und wenn beide übereinstimmen, dann führe die Weiterleitung durch, aber ich suche nach mehr erfahrenen Anleitungen.

    
Latox 04.01.2012, 11:24
quelle

4 Antworten

27

Verwenden Sie verzögerte Objekte :

%Vor%     
Felix Kling 04.01.2012 11:30
quelle
6

Ok, das ist ziemlich einfach, da du jQuery benutzt. jQuery kommt mit einem integrierten Promoter, der auch mit den Ajax-Aufrufen von jQuery verbunden ist. Was bedeutet das? Nun, wir können leicht so gehen:

%Vor%

Hinweis: Der obige Code wird nur ausgelöst, wenn alle Anforderungen erfolgreich abgeschlossen wurden. Wenn Sie den Fall bearbeiten müssen, wenn ein oder mehrere angeforderte Fehler fehlgeschlagen sind, verwenden Sie auch .then() oder .fail() anstelle von .done() .

    
jAndy 04.01.2012 11:31
quelle
2

Behalten Sie einfach einen Zähler der AJAX-Anrufe und prüfen Sie, ob alle abgeschlossen sind. Etwas wie das:

%Vor%     
Aaron J Spetner 04.01.2012 11:30
quelle
0

Standardmäßig ist $ .ajax asynchron. Fügen Sie in den Optionen, die übergeben werden,

hinzu %Vor%

Damit werden die Anrufe serialisiert, die Sie ausführen, so wie Sie möchten.

Nach dem Kommentieren des Originalposters besteht die mögliche Lösung darin, Folgendes zu tun:

  • Ermitteln Sie im Submit-Call die Anzahl der Anrufe, die getätigt werden sollen.
  • Speichern Sie dieses Ergebnis als lokale Variable in der Handler-Funktion
  • Erstellen Sie einen Rückruf bei 'complete:', der den Wert der Anrufe überprüft
    • Wenn die Anzahl der Aufrufe größer als 0 ist, dekrementieren Sie den Wert und geben Sie
    • zurück
    • Wenn die Anzahl der Aufrufe Null erreicht, aktualisieren Sie die window.location (sollten Sie window.location.href verwenden, da window.location ein Objekt ist, Browser dies jedoch zulassen und korrekt ausführen)

Hinweis, ich habe keine Informationen über die Thread-Sicherheit bei der Durchführung dieser Art von Operation so YMMV.

Beispielcode:

%Vor%     
Dave G 04.01.2012 11:28
quelle

Tags und Links