Maison  >  Article  >  interface Web  >  `Promise.all()` garantit-il l'ordre des valeurs résolues ?

`Promise.all()` garantit-il l'ordre des valeurs résolues ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-03 05:40:02871parcourir

Does `Promise.all()` Guarantee the Order of Resolved Values?

Promise.all : Ordre des valeurs résolues

La méthode Promise.all() permet l'exécution et la résolution simultanées de plusieurs promesses, offrant aux développeurs un outil puissant pour la programmation asynchrone . Une question intrigante se pose concernant l'ordre des valeurs résolues dans le tableau de résultats de Promise.all().

Selon le Mozilla Developer Network (MDN), les résultats obtenus à partir du rappel .then() de Promise. all() semble être classé dans le même ordre que celui promis par l'entrée. 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?
});

Ce comportement est-il garanti par la spécification Promises ? Examinons les détails techniques pour le découvrir.

Préserver l'ordre dans Promise.all()

Dans la méthode Promise.all(iterable), iterable représente une collection de promesses. La fonction PerformPromiseAll(iterator, constructor, resultCapability) est invoquée en interne, parcourant l'itérable à l'aide de IteratorStep(iterator).

Lorsqu'une promesse est réglée avec une valeur résolue, Promise.all() Resolve est invoquée. Chaque promesse résolue comporte un emplacement [[Index]] interne, indiquant sa position dans l'itérable d'origine.

Par conséquent, la sortie de Promise.all() maintient un ordre strict qui correspond à l'ordre des promesses dans l'entrée itérable. Cela est vrai tant que l'itérable fourni est strictement ordonné, comme un tableau.

Démonstration de la préservation de la commande

Voici un exemple pratique qui illustre la préservation de la commande dans Promise.all() :

<code class="javascript">// Used to display results
const write = msg => {
  document.body.appendChild(document.createElement('div')).innerHTML = msg;
};

// Different speed async operations
const slow = new Promise(resolve => {
  setTimeout(resolve, 200, 'slow');
});
const instant = 'instant';
const quick = new Promise(resolve => {
  setTimeout(resolve, 50, 'quick');
});

// The order is preserved regardless of what resolved first
Promise.all([slow, instant, quick]).then(responses => {
  responses.map(response => write(response));
});</code>

Dans ce scénario, la valeur « instantanée » est résolue immédiatement, suivie de « rapide » et « lente ». Cependant, conformément à la préservation de l'ordre dans Promise.all(), les résultats seront affichés dans l'ordre : "lent", "instantané", "rapide", en s'alignant sur l'ordre des promesses dans le tableau d'entrée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn