D'après ce que je comprends, une promesse est quelque chose qui peut résoudre () ou rejeter (), mais j'ai été surpris de découvrir que le code de la promesse continue de s'exécuter après l'appel d'une résolution ou d'un rejet.
J'ai considéré que la résolution ou le rejet était une version asynchrone de exit ou de retour, qui arrêterait toute exécution immédiate des fonctions.
Quelqu'un peut-il expliquer pourquoi l'exemple suivant montre parfois le fichier console.log après un appel de résolution:
var call = function() {
return new Promise(function(resolve, reject) {
resolve();
console.log("Doing more stuff, should not be visible after a resolve!");
});
};
call().then(function() {
console.log("resolved");
});
javascript
promise
ecmascript-6
es6-promise
Ludwig van Beethoven
la source
la source
resolve()
n'est pas une instruction de contrôle JS qui aurait comme par magie l'effetreturn
, c'est juste un appel de fonction, et oui, l'exécution continue après elle.Réponses:
JavaScript a le concept de "courir jusqu'à la fin" . À moins qu'une erreur ne soit générée, une fonction est exécutée jusqu'à ce qu'une
return
instruction ou sa fin soit atteinte. Un autre code en dehors de la fonction ne peut pas interférer avec cela (à moins que, encore une fois, une erreur ne soit générée).Si vous souhaitez
resolve()
quitter votre fonction d'initialisation, vous devez l'ajouter enreturn
:la source
resolve()
est elle-même une fonction asynchrone. Comme nous l'avons vu dans l'autre réponse (supprimée), certaines personnes pensent que l'appelresolve
exécutera immédiatement tous les rappels.resolve
lui-même n'est pas asynchrone, il est complètement synchrone. Bien qu'en utilisant strictement l'API ES6, il n'est pas observable si elle est synchrone ou asynchrone.resolve
entraînera l' appel immédiat de tous les rappels enregistrés, de sorte qu'ils font partie de la pile d'appels actuelle. Ce n'est pas vrai, au lieu de cela, il met simplement en file d'attente les rappels (et vous avez raison, ce n'est pas asynchrone, mais il fait juste son truc et se termine immédiatement)console.log
message apparaît au lieu de savoir pourquoi il apparaît dans cet ordre. Jusqu'à présent, ce quiresolve
fait et comment les promesses n'a aucun rapport avec la manière dont j'interprète la question. Mais bien sûr, il est toujours important de savoir dans le contexte des promesses. Une des raisons pour lesquelles j'ai voté pour votre réponse :)Les rappels qui seront
resolve
appelés lors d' une promesse sont toujours requis par la spécification pour être appelés de manière asynchrone. Cela permet de garantir un comportement cohérent lors de l'utilisation de promesses pour un mélange d'actions synchrones et asynchrones.Par conséquent, lorsque vous appelez,
resolve
le rappel est mis en file d'attente et l'exécution de la fonction se poursuit immédiatement avec tout code suivant l'resolve()
appel.Ce n'est qu'une fois que la boucle d'événement JS a retrouvé le contrôle que le rappel peut être supprimé de la file d'attente et réellement appelé.
la source
EnqueueJob
, qui est appelée par.then
.