Comme les réponses précédentes l'ont déjà indiqué, Promise.all
agrège toutes les valeurs résolues avec un tableau correspondant à l'ordre d'entrée des promesses d'origine (voir Agrégation des promesses ).
Cependant, je tiens à préciser que la commande n'est conservée que côté client!
Pour le développeur, il semble que les promesses ont été remplies dans l'ordre, mais en réalité, les promesses sont traitées à des vitesses différentes. Ceci est important à savoir lorsque vous travaillez avec un backend distant car le backend peut recevoir vos promesses dans un ordre différent.
Voici un exemple qui illustre le problème en utilisant des délais d'expiration:
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)
Dans le code ci-dessus, trois promesses (A, B, C) sont données Promise.all
. Les trois promesses s'exécutent à des vitesses différentes (C étant le plus rapide et B étant le plus lent). C'est pourquoi les console.log
déclarations des promesses apparaissent dans cet ordre:
C (fast)
A (slow)
B (slower)
Si les promesses sont des appels AJAX, un backend distant recevra ces valeurs dans cet ordre. Mais du côté client Promise.all
garantit que les résultats sont classés selon les positions d'origine du myPromises
tableau. C'est pourquoi le résultat final est:
['A (slow)', 'B (slower)', 'C (fast)']
Si vous souhaitez garantir également l'exécution réelle de vos promesses, vous aurez besoin d'un concept tel qu'une file d'attente de promesses. Voici un exemple utilisant p-queue (attention, vous devez envelopper toutes les promesses dans des fonctions):
File d'attente de promesses séquentielle
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);
Résultat
A (slow)
B (slower)
C (fast)
['A (slow)', 'B (slower)', 'C (fast)']