Maison >interface Web >js tutoriel >`Promise.all()` garantit-il l'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.
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.
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!