Ich führe eine FOREACH-Schleife für ein Array aus und führe zwei Aufrufe aus, die Versprechungen zurückgeben, und ich möchte ein Objekt mit this.options
füllen und dann andere Sachen damit machen. Im Moment laufe ich in das Async-Problem, wenn ich das folgende Codebeispiel benutze und ich gehe zuerst in die then-Funktion.
Dieser Code funktioniert unten, aber er funktioniert nur für das erste Element im Array, weil ich die resultierende Funktion in .then
der Antwort aufruft. Ich möchte alle holen zuerst für alle Elemente des Arrays und dann rufen Sie die resultierende Funktion, etwas zu tun.
Wie befülle ich das self.files
-Objekt, nachdem die forEach-Schleife abgeschlossen ist, und rufe dann die resultierende Funktion mit dem Dateiobjekt auf?
Promise.all()
wird hier hilfreich sein:
Dies startet den AJAX-Aufruf für jedes der Elemente, fügt das Ergebnis jedes Aufrufs zu self.files
hinzu, sobald der Aufruf abgeschlossen ist, und ruft self.resultingFunction()
auf, nachdem alle Aufrufe abgeschlossen wurden.
Bearbeiten: Vereinfachend basierend auf den Vorschlägen von Yury Tarabanko.
Nur eine kleine Variation der oben genannten akzeptierten Lösung wäre:
%Vor%Der folgende Code ist ein einfaches Verständnis der Synchronisierung mit Promise.
%Vor%Im obigen Beispiel wird das Array nums für 5 Sekunden gehalten. und es wird nach der Veröffentlichung auf der Konsole gedruckt.
Sie können sich diese Antwort auf eine ähnliche Frage ansehen , um einen hervorragenden Hinweis zu erhalten. Die dort angegebene Lösung verwendet Array#reduce()
, um zu vermeiden, dass alle Promises angesammelt werden müssen, bevor eine Arbeit ausgeführt wird, anstatt Promise.all()
zu verwenden.
Tags und Links javascript arrays promise foreach es6-promise