Maison  >  Questions et réponses  >  le corps du texte

Ordre d'exécution de la promesse imbriquée

<p>Je lisais des informations sur les promesses imbriquées et je suis tombé sur ce défi de codage dans un didacticiel. Quelqu'un peut-il expliquer l'ordre d'exécution de ce code ? </p> <pre class="brush:php;toolbar:false;">nouvelle promesse((resolve) => { nouvelle promesse ((res) => { console.log("c"); résoudre (3); res(2); }).then((réponse) => console.log(réponse)) }).then((res) => console.log(res));</pre> <p>J'ai exécuté ce code et le résultat était : </p> <pre class="brush:php;toolbar:false;">c 2 3≪/pré> <p>Mais je m'attendais à ce que le résultat soit : </p> <pre class="brush:php;toolbar:false;">c 3 2&Lt ;/pré> ; <p>Parce que la promesse extérieure est résolue en premier, puis la promesse intérieure est résolue plus tard. </p>
P粉459440991P粉459440991451 Il y a quelques jours560

répondre à tous(2)je répondrai

  • P粉770375450

    P粉7703754502023-08-17 16:48:21

    En plus de la réponse de Nicholas, vous pourriez être bloqué par l'utilisation répétée de l'identifiant 'res'. La première utilisation d'une promesse en interne est comme fonction de rappel, qui renvoie la valeur 2 à la promesse. La deuxième utilisation dans la dernière ligne a une portée différente et est utilisée comme nom de paramètre pour la méthode .then() de la promesse externe. Cela pourrait être utile si vous remplacez « res » dans la dernière ligne par « outerPromiseResult », pour clarifier les choses.

    répondre
    0
  • P粉493534105

    P粉4935341052023-08-17 15:42:59

    En bref, c'est à cause de l'ordre dans lequel vous appelez .then.

    new Promise((resolve) => {
        new Promise((res) => {
            console.log("c");
            resolve(3);
            res(2);

    Dans le code ci-dessus, nous entrons dans le constructeur externe, qui appelle immédiatement la fonction externe. Créez ensuite une promesse interne et appelez la fonction interne. La fonction interne enregistre "c", puis résout la promesse externe en 3, puis résout la promesse interne en 2.

    Donc, à ce stade, nous avons 2 promesses résolues, mais aucun code essayant de les utiliser.

    }).then((response) => console.log(response))

    Après avoir fini de construire la Promesse intérieure, nous faisons appel à .then la Promesse intérieure. Une fois la promesse résolue, une microtâche est mise en file d'attente à exécuter.

    }).then((res) => console.log(res));

    Après avoir fini de construire la Promesse externe, nous faisons appel à .then sur la Promesse externe. Une fois la promesse résolue, une microtâche est mise en file d'attente à exécuter.

    Maintenant, nous avons fini d'exécuter tout le code synchrone. La pile d'appels est vide et la microtâche commence à s'exécuter. Celles-ci sont exécutées dans l'ordre premier entré, premier sorti, de sorte que les microtâches liées à la promesse interne s'exécutent en premier, enregistrement 2. Exécutez ensuite les microtâches restantes et enregistrez-en 3.

    répondre
    0
  • Annulerrépondre