Pregunta

por favor, que me ayude a entender esto.

Tiene una función que llama a un par de métodos:

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

A partir de las lenguas que no tienen las devoluciones de llamada o funciones anónimas que me acostumbré a el hecho de que la ejecución no debe durar hasta que el método devuelve.

Así que si me llama methodA con la devolución de llamada, la ejecución tendría que esperar hasta que el método devuelve lo que no sería asincrónica, ¿verdad ?

De modo que, por ejemplo, puedo almacenar la devolución de llamada a un objeto y tiene la methodA de retorno.Luego methodB y methodC son ejecutados.Y cuando el usuario hace clic en un botón, algunos controlador ejecuta el callback ?

He llegado a la conclusión de que no hay nada asincrónica acerca de javascript en comparación con java o python (no respecto de subprocesamiento múltiple)....porque en java la devolución de llamada no se cierre/método anónimo, sino un objeto con "ejecutar" método y sería exactamente el mismo, sólo un poco más complicado ...Por supuesto, hay esta JS caso específico del sistema de DOM

¿Fue útil?

Solución

Las devoluciones de llamada en JavaScript no se implícitamente agregar comportamiento asincrónico.Cuando una función de devolución de llamada se invoca, se ejecuta a la derecha, a continuación,, así como una función normal.(En realidad, una función de devolución de llamada es sólo una función normal...)

Debido a esto, es imposible para determinar cuando la ejecución de la devolución de llamada en el ejemplo que se va a ejecutar en relación a los otros métodos (excepto que no se puede ejecutar antes de methodA se invoca) -- podría ser llamado de methodA o methodB o de un clic más tarde, o no del todo.(Sin embargo, a menos que exista una excepción; o una de las funciones invoca una de las otras funciones -- entonces methodA se ejecutará antes de methodB lo que a su vez se ejecute antes de methodC;si methodA lanzó una excepción, ni methodB ni methodC podría ser invocada).

¿ ¿ agregar el comportamiento asincrónico es un eventos asíncronos fuente, como un evento de temporizador o de la interfaz de usuario de la acción como un clic del botón.

Sin embargo, es importante tener en cuenta que Javascript no tiene ni el apoyo de roscado.El Javascript debe "detener" (ejecución debe de retorno de la función de devolución de llamada se invoca desde un evento asincrónico fuente) antes de que un nuevo evento asincrónico puede ser activado.(Eventos asíncronos están en la cola [correspondiente] para un evento de temporizador no se "pierde" si otro de devolución de llamada tarda mucho tiempo para ejecutar.)

Esta es la razón por la while (true) {} hará un navegador página de congelación y evitar controladores de eventos de botón que se está procesando.

Feliz codificación.


Casos de ejemplo (jsfiddle demo):

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")
}))

Advertencia:No parece ser un problema con Firefox 4 (4.0.1) y el código de arriba.Aunque funciona como se ha demostrado, el orden esperado difiere de la de la orden real si el tiempo de espera es de debajo de 800ms.He publicado ASÍ:Asincrónica evento de temporizador se ejecutan de forma sincrónica ("buggy") en Firefox 4? así que es de esperar que habrá una resolución.El comportamiento funciona como se espera en Firefox 3, es decir, 9 y Chrome 11.

Otros consejos

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(){...})

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top