Sind rekursive AJAX eine schlechte Idee?

8

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?

    
Stephen Collins 08.04.2014, 14:27
quelle

3 Antworten

1

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.

Einige Verbesserungen können sein:

  • Rückgabe des Versprechens anstelle eines Rückrufarguments
  • Verwenden von .map anstelle von forEach mit Push.
  • Verwendung von .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: ?)

Wir können etwas tun wie:

%Vor%

Was Sie tun können:

%Vor%     
Benjamin Gruenbaum 09.04.2014, 15:27
quelle
5

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%     
Justin Niessner 08.04.2014 14:31
quelle
3

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

    
Gone Coding 08.04.2014 14:38
quelle

Tags und Links