Maison > interface Web > js tutoriel > le corps du texte

Quand les gestionnaires JavaScript Promise .then() s'exécutent-ils les uns par rapport aux autres ?

Susan Sarandon
Libérer: 2024-10-25 08:19:28
original
394 Les gens l'ont consulté

When do JavaScript Promise .then() Handlers Execute in Relation to Each Other?

Comprendre l'ordre d'exécution dans les promesses JavaScript

Les promesses en JavaScript offrent un modèle de programmation asynchrone dans lequel le code est exécuté une fois un événement spécifique ou une promesse , est accompli. Cependant, lorsqu'il s'agit de plusieurs promesses, il est essentiel de comprendre l'ordre d'exécution pour éviter un comportement imprévisible.

Considérez l'extrait de code suivant :

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);
Copier après la connexion

Lors de l'exécution, vous pouvez observer ce qui suit : ordre de sortie :

1
2 "A"
3 "B"
7 "C"
4 "B"
8 undefined
9 "D"
5 undefined
10 undefined
6
Copier après la connexion

Comprendre l'ordre d'exécution

  1. Les promesses sont résolues de manière asynchrone :
    Les promesses sont résolues indépendamment de le fil d'exécution actuel. Cela signifie que les gestionnaires .then() sont appelés de manière asynchrone une fois le thread en cours terminé.
  2. Les promesses sont exécutées dans une file d'attente :
    .les gestionnaires then() sont programmés pour s'exécuter après le précédent. le gestionnaire se termine. Ils sont essentiellement mis en file d'attente, c'est pourquoi vous voyez 1, 2 "A" et 3 "B" imprimés dans cet ordre.
  3. Les promesses intérieures créent des chaînes indépendantes :
    Promesses créées dans les gestionnaires .then() imbriqués, comme Promise.resolve('C') et Promise.resolve('D'), créez de nouvelles chaînes de promesses indépendantes. Ces chaînes internes ne se synchronisent pas intrinsèquement avec la chaîne externe.
  4. L'ordre d'exécution n'est pas déterministe :
    L'ordre d'exécution de ces chaînes indépendantes n'est pas garanti. Dans ce cas, le moteur de promesse choisit d'exécuter les gestionnaires .then() des lignes 5 et 12 avant ceux des lignes 6 et 7.

Recommandations

Pour garantir un ordre d'exécution spécifique, évitez de créer des chaînes de promesses non synchronisées et comptez plutôt sur des promesses liées de manière séquentielle. Renvoie les promesses des gestionnaires internes .then() pour les enchaîner avec la promesse parent, comme indiqué ci-dessous :

Promise.resolve('A').then(function (a) {
    console.log(2, a);
    return 'B';
}).then(function (a) {
    var p = Promise.resolve('C').then(function (a) {
        console.log(7, a);
    }).then(function (a) {
        console.log(8, a);
    });
    console.log(3, a);
    return p; // Link the inner promise to the parent chain
}).then(function (a) {
    var p = Promise.resolve('D').then(function (a) {
        console.log(9, a);
    }).then(function (a) {
        console.log(10, a);
    });
    console.log(4, a);
    return p; // Link the inner promise to the parent chain
}).then(function (a) {
    console.log(5, a);
});

console.log(1);

setTimeout(function () {
    console.log(6)
}, 0);
Copier après la connexion

Avec cette approche, l'ordre d'exécution devient entièrement déterministe : 1, 2 "A", 3 " B", 7 "C", 8 indéfini, 4 indéfini, 9 "D", 10 indéfini, 5 indéfini et 6.

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!