console.log(response ))}).alors(((">
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 ?
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));
J'ai exécuté ce code et le résultat était :
c 2 3≪/pré>Mais je m'attendais à ce que le résultat soit :
c 3 2&Lt ;/pré> ;Parce que la promesse extérieure est résolue en premier, puis la promesse intérieure est résolue plus tard.
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.
En bref, c'est à cause de l'ordre dans lequel vous appelez
.then
.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.
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.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.