Wenn man sich MDN ansieht, sieht es so aus, als ob der values
an den then()
Rückruf von Promise.all übergebene Wert die Werte in der Reihenfolge der Versprechen enthält. Beispielsweise:
var somePromises = [1, 2, 3, 4, 5].map(Promise.resolve);
return Promise.all(somePromises).then(function(results) {
console.log(results) // is [1, 2, 3, 4, 5] the guaranteed result?
});
Kann jemand eine Spezifikation zitieren, in der angegeben ist, in welcher Reihenfolge sie values
sein soll?
PS: Das Ausführen eines solchen Codes hat gezeigt, dass dies wahr zu sein scheint, obwohl dies natürlich kein Beweis ist - es könnte Zufall gewesen sein.
quelle
throw
eine Ausnahme sein, wenn Sie eine iterable an übergebenPromise.all
. Außerdem ist mir keine Implementierung von Userland-Versprechungen bekannt, die derzeit das Übergeben von Iterables unterstützt, obwohl viele zu diesem Zeitpunkt darüber debattiert und sich dagegen entschieden haben.Promise.all
kann nicht verwendet werden, um eine Reihe von Versprechungen nacheinander auszuführen. Die in den Iterator geladenen Versprechen müssen unabhängig voneinander sein, damit dies vorhersehbar funktioniert.Wie in den vorherigen Antworten bereits angegeben, werden
Promise.all
alle aufgelösten Werte mit einem Array aggregiert, das der Eingabereihenfolge der ursprünglichen Versprechen entspricht (siehe Aggregieren von Versprechen ).Ich möchte jedoch darauf hinweisen, dass die Bestellung nur auf Kundenseite erhalten bleibt!
Für den Entwickler sieht es so aus, als ob die Versprechen in der richtigen Reihenfolge erfüllt wurden, aber in Wirklichkeit werden die Versprechen mit unterschiedlichen Geschwindigkeiten verarbeitet. Dies ist wichtig zu wissen, wenn Sie mit einem Remote-Backend arbeiten, da das Backend Ihre Versprechen möglicherweise in einer anderen Reihenfolge erhält.
Hier ist ein Beispiel, das das Problem anhand von Zeitüberschreitungen demonstriert:
Promise.all
In dem oben gezeigten Code werden drei Versprechen (A, B, C) gegeben
Promise.all
. Die drei Versprechen werden mit unterschiedlichen Geschwindigkeiten ausgeführt (C ist die schnellste und B die langsamste). Deshalb erscheinen dieconsole.log
Aussagen der Versprechen in dieser Reihenfolge:Wenn es sich bei den Versprechungen um AJAX-Aufrufe handelt, erhält ein Remote-Backend diese Werte in dieser Reihenfolge. Auf der Client-Seite wird jedoch
Promise.all
sichergestellt, dass die Ergebnisse gemäß den ursprünglichen Positionen desmyPromises
Arrays sortiert werden . Deshalb ist das Endergebnis:Wenn Sie auch die tatsächliche Ausführung Ihrer Versprechen garantieren möchten, benötigen Sie ein Konzept wie eine Versprechen-Warteschlange. Hier ist ein Beispiel für die Verwendung der p-Warteschlange (Vorsicht, Sie müssen alle Versprechen in Funktionen einschließen):
Sequentielle Versprechenswarteschlange
Ergebnis
quelle
Ja, die Werte in
results
sind in derselben Reihenfolge wie diepromises
.Man könnte die ES6-Spezifikation
Promise.all
zitieren , obwohl sie aufgrund der verwendeten Iterator-API und des generischen Versprechen-Konstruktors etwas kompliziert ist. Sie werden jedoch feststellen, dass jeder Resolver-Rückruf eine hat[[index]]
Attribut hat, das in der Versprechen-Array-Iteration erstellt und zum Festlegen der Werte im Ergebnis-Array verwendet wird.quelle