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
const myPromises = [
new Promise((resolve) => setTimeout(() => {resolve('A (slow)'); console.log('A (slow)')}, 1000)),
new Promise((resolve) => setTimeout(() => {resolve('B (slower)'); console.log('B (slower)')}, 2000)),
new Promise((resolve) => setTimeout(() => {resolve('C (fast)'); console.log('C (fast)')}, 10))
];
Promise.all(myPromises).then(console.log)
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 die console.log
Aussagen der Versprechen in dieser Reihenfolge:
C (fast)
A (slow)
B (slower)
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 des myPromises
Arrays sortiert werden . Deshalb ist das Endergebnis:
['A (slow)', 'B (slower)', 'C (fast)']
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
const PQueue = require('p-queue');
const queue = new PQueue({concurrency: 1});
// Thunked Promises:
const myPromises = [
() => new Promise((resolve) => setTimeout(() => {
resolve('A (slow)');
console.log('A (slow)');
}, 1000)),
() => new Promise((resolve) => setTimeout(() => {
resolve('B (slower)');
console.log('B (slower)');
}, 2000)),
() => new Promise((resolve) => setTimeout(() => {
resolve('C (fast)');
console.log('C (fast)');
}, 10))
];
queue.addAll(myPromises).then(console.log);
Ergebnis
A (slow)
B (slower)
C (fast)
['A (slow)', 'B (slower)', 'C (fast)']