Question

merci de m'aider à comprendre cela.

Vous avez une fonction qui appelle quelques méthodes:

function() {
   methodA(function(){...});
   methodB();
   methodC();
}

De langues qui n'ont pas de rappels ou des fonctions anonymes, je me suis habitué au fait que l'exécution ne va pas jusqu'à une méthode retourne.

De sorte que, si j'ai appelé methodA avec le rappel, l'exécution devrait attendre le retour de la méthode qui ne serait pas asynchrone, non ?

De sorte que, par exemple, je peux stocker le rappel à un objet et ont la methodA retour.Puis methodB et methodC sont exécutées.Et lorsque l'utilisateur clique sur un bouton, certaines gestionnaire d'exécution de la fonction de rappel ?

Je suis venu à la conclusion qu'il n'y a rien asynchrone à propos de javascript en comparaison avec java ou python (pas sur le multithreading)....parce que dans java le rappel ne sera pas de la fermeture d'une méthode anonyme, mais un objet avec la méthode "execute" et ce serait exactement la même, juste un peu plus compliqué ...Bien sûr, il y a cette JS système d'événements spécifiques pour les DOM

Était-ce utile?

La solution

Rappels en JavaScript ne sont pas implicitement ajouter un comportement asynchrone.Lorsqu'une fonction de rappel est appelée, elle s'exécute à droite, puis, tout comme une fonction normale.(En fait, une fonction de rappel est juste une fonction normale...)

De ce fait, il est impossible pour déterminer quand l'exécution de la fonction de rappel dans l'exemple sera exécuté en relation avec les autres méthodes (sauf qu'il ne peut pas s'exécuter avant methodA est invoquée) -- il pourrait être appelé à partir de methodA ou methodB ou à partir d'un clic plus tard, ou pas du tout.(Cependant, à moins d'une exception-ou l'une des fonctions invoque l'une des autres fonctions, puis methodA avant methodB qui sera à son tour avant de l'exécuter methodC;si methodA a déclenché une exception, alors ni methodB ni methodC serait invoquée).

Ce n' ajouter un comportement asynchrone est un asynchrone source de l'événement, comme un événement de minuterie ou de l'INTERFACE utilisateur action telle qu'un clic de bouton.

Cependant, il est important de garder à l'esprit que le Javascript n'ont pas ou soutien threading.Le Javascript doit "s'arrêter" (exécution doit retourner à partir de la fonction de callback appelée à partir d'un événement asynchrone source) avant qu'un nouvel événement asynchrone peut être déclenchée.(Les événements asynchrones sont mis en file d'attente [le cas échéant] ainsi, un événement timer ne sera pas "perdu" si un autre rappel prend trop de temps à exécuter.)

C'est pourquoi while (true) {} va faire une page de navigateur de gel et de prévenir les gestionnaires d'événements de bouton en cours de traitement.

Heureux de codage.


Exemple de cas (jsfiddle démo):

function invokeNow(callback) {
   // nothing asynchronous going on here.
   // the callback is invoked right now and the result is returned.
   return callback()
}
alert(invokeNow(function () { return "Hello world!" }))

function doLater(callback) {
    // setup an asynchronous event
    setTimeout(callback, 1000)
    return "It isn't 'later' yet!"
}

alert(doLater(function () {
    alert("Later!")
    // note that this is running in the callback from the previous
    // timer event. if this code was below the outer alert then
    // it wouldn't have allowed the first timer callback to have occurred
    // until the blocking while was complete
    alert(doLater(function () { alert("I still ran!") }))
    var end = (+new Date) + 4000
    while ((+new Date) < end) { /* wait */ }
    alert("I am done waiting")
}))

Avertissement:Il semble y avoir un problème avec Firefox 4 (4.0.1) et le code ci-dessus.Alors qu'il travaille comme l'a démontré, l'ordre attendu diffère de la commande si le délai est inférieur à propos de 800ms.J'ai posté DONC:Asynchrone événement de minuterie en cours d'exécution en mode synchrone (“buggy”) dans Firefox 4? donc j'espère qu'il y aura une certaine résolution.Le comportement fonctionne comme prévu dans Firefox 3, IE 9, et Chrome 11.

Autres conseils

function main() {
   methodA(function callback(){...});
   methodB();
   methodC();
}

Assuming that callback is not immediately executed.

Execution order:

  • methodA
  • methodB
  • methodC
  • ... other things until the stack is empty
  • callback

Javascript is sequential except if you use setInterval, setTimeout, or make a request to a server with a callback or using onload. Not sure there are other cases.

If you have something like:

function methodA(fn){
  ...
  fn();
}

Then the callback will be called when you call methodA(function(){...})

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top