En regardant MDN, il semble que le values
passé au then()
rappel de Promise.all contient les valeurs dans l'ordre des promesses. Par exemple:
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?
});
Quelqu'un peut-il citer une spécification indiquant dans quel ordre values
doit être placé?
PS: L'exécution d'un code comme celui-ci a montré que cela semble être vrai bien que ce ne soit bien sûr pas une preuve - cela aurait pu être une coïncidence.
la source
throw
une excpetion si vous passez un itérable àPromise.all
. De plus, je ne connais aucune implémentation de promesse userland qui prend actuellement en charge le passage d'itérables bien que beaucoup en aient débattu et se soient prononcées contre elle à l'époque.Promise.all
ne peut pas être utilisé pour exécuter un tableau de promesses dans l'ordre, les unes après les autres. Les promesses chargées dans l'itérateur doivent être indépendantes les unes des autres pour que cela fonctionne de manière prévisible.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
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 lesconsole.log
déclarations des promesses apparaissent dans cet ordre: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 dumyPromises
tableau. C'est pourquoi le résultat final est: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
Résultat
la source
Oui, les valeurs de
results
sont dans le même ordre que lepromises
.On pourrait citer la spécification ES6
Promise.all
, même si elle est un peu compliquée en raison de l'api de l'itérateur utilisé et du constructeur de promesse générique. Cependant, vous remarquerez que chaque rappel de résolveur a un[[index]]
attribut qui est créé dans l'itération du tableau de promesse et utilisé pour définir les valeurs sur le tableau de résultats.la source