Maison > Questions et réponses > le corps du texte
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.
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.