Ich habe eine einfache Funktion, um ein Array von Vorlagen einzufügen:
%Vor%Es erscheint mir logisch, einfach von einem zum nächsten zu gehen, bis sie alle abgerufen sind, und dann einen Rückruf zu der aufrufenden Funktion durchzuführen. Aber ich bin neugierig, ob das irgendwelche schlimmen Nebenwirkungen hat. Bisher habe ich noch keine gesehen, aber ich möchte nicht in die Produktion gehen, ohne vorher einige mögliche Probleme zu kennen.
UPDATE: Mit Hilfe von Google und BenjaminGruenbaum habe ich eine Lösung gefunden:
%Vor% Ich verwende templates
hier, weil ich in der Lage sein muss, auf jede Vorlage mit Namen zu verweisen, aber irgendwie fühlt es sich zerbrechlich oder unzuverlässig an. Sieht das sicher aus?
Ihr aktualisierter Code ist viel besser als Ihr ursprünglicher, aber es hat immer noch ein paar Probleme, das Hauptproblem besteht darin, Versprechungen und Rückrufe zu mischen, anstatt Sprachfunktionen (Rückgabewert) zu verwenden und keine Zuordnungen zu verwenden.
.map
anstelle von forEach mit Push. .then
anstelle eines Erfolgs-Callbacks, um zwei Handler für dieselbe Sache und möglicherweise nicht spezifiziertes Verhalten zu vermeiden (wird die Ausführung zuerst ausgeführt? Ist success:
?) Was Sie tun können:
%Vor%Ja. Mehrere AJAX-Aufrufe auf diese Weise zu machen ist eine schlechte Idee, aber möglicherweise nicht aus dem Grund, dass Sie denken.
Dies wird dazu führen, dass alle Ihre Anrufe sequentiell ausgeführt werden, anstatt die Anrufe parallel zu machen und darauf zu warten, dass sie so enden.
Es wäre viel besser, Versprechen zu verwenden, um alle Ihre Anrufe zu tätigen und dann zu warten, bis alle fertig sind vor dem Fortfahren. Es würde ungefähr so aussehen:
%Vor%Obwohl es rekursiv aussieht (und ich benutze dafür auch den Ausdruck rekursives Ajax ), wird die Funktion technisch ausgeführt, bevor sie erneut aufgerufen wird. Sie ist also nicht rekursiv ... vielleicht sollten wir sie aufrufen. verkettet "Ajax Anrufe, wie es Async-Ereignisse nur verkettet? :)
Es ist kein Problem, es auf diese Weise zu tun, wenn es Ihnen nichts ausmacht, Ihre Ajax-Anfrage einzeln nacheinander einzureihen. Ich habe es ein paar Mal so benutzt, um sicherzustellen, dass die Bandbreite genutzt werden kann.
Sie müssen auf Edge Cases achten, damit Serverfehler fehlerfrei behandelt werden.
Das ist eigentlich eine gute Technik für den Umgang mit mobilen Geräten, die bei einer großen Anzahl von Anfragen, die auf einmal ausgehen, ersticken.
Ich habe ein Plugin geschrieben, das Teile eines massiven Antragsformulars über Ajax geladen hat und gefundene Geräte wie das iPad konnten nicht mehr als eine Handvoll gleichzeitiger Ajax-Anfragen bewältigen. Ich beendete rekursive / verkettete Ajax-Aufrufe, um das Problem zu lösen (und hatte den Bonus, unseren Server nicht zu ersticken):)