Maison >interface Web >js tutoriel >Pourquoi l'ordre d'exécution de la promesse ne correspond-il pas aux attentes en JavaScript ?
Problème :
L'extrait suivant démontre l'utilisation de JavaScript promesses, et l'ordre d'exécution est intrigant.
<code class="javascript">Promise.resolve('A') .then(function(a){console.log(2, a); return 'B';}) .then(function(a){ Promise.resolve('C') .then(function(a){console.log(7, a);}) .then(function(a){console.log(8, a);}); console.log(3, a); return a;}) .then(function(a){ Promise.resolve('D') .then(function(a){console.log(9, a);}) .then(function(a){console.log(10, a);}); console.log(4, a);}) .then(function(a){ console.log(5, a);}); console.log(1); setTimeout(function(){console.log(6)},0);</code>
Le résultat indique que l'ordre d'exécution est :
1 2 "A" 3 "B" 7 "C" 4 "B" 8 undefined 9 "D" 5 undefined 10 undefined 6
La question posée est de savoir pourquoi l'ordre d'exécution n'est pas 1, 2 , 3, 4..., et en quoi l'espérance de 1, 2, 3, 4... diffère-t-elle du résultat ?
Réponse :
Commentaires :
L'exécution de promesses dans un gestionnaire .then() sans les renvoyer du rappel .then() crée une nouvelle séquence de promesses non attachée qui ne se synchronise en aucun cas avec les promesses parentes. chemin. Ceci est généralement considéré comme un bug et certains moteurs de promesses émettent des avertissements lorsque cela se produit, car ce n'est généralement pas le comportement prévu. Un cas d'utilisation valide pourrait être une opération « lancer et oublier » où ni les erreurs ni la synchronisation ne sont un problème.
Les promesses Promise.resolve() au sein des gestionnaires .then() créent de nouvelles chaînes de promesses qui s'exécutent indépendamment du parent. chaîne. Avec les opérations asynchrones réelles, telles que les appels AJAX, il n'existe aucun comportement prévisible pour les chaînes de promesses indépendantes et déconnectées. Le moment de l'achèvement est indéterminé, comme le lancement de quatre appels AJAX en parallèle dont l'ordre d'achèvement est inconnu. Dans le code fourni, toutes les opérations sont synchrones, ce qui entraîne un comportement cohérent, mais il ne faut pas s'y fier car l'objectif de conception des promesses est une exécution asynchrone.
Résumé :
Analyse ligne par ligne :
Conclusion :
L'absence d'ordre spécifique dans les exécutions de promesses Promise.resolve() au sein des gestionnaires .then(), ainsi que le l'indétermination de la planification du gestionnaire .then() par rapport à setTimeout() pour divers moteurs, souligne l'importance de contrôler l'ordre d'exécution grâce à l'enchaînement des promesses.
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!