¿Cómo se vuelve asíncrono el código Javascript cuando se usan devoluciones de llamada?

26

He estado leyendo mucho en línea tratando de descubrir cómo escribir código JavaScript asincrónico. Una de las técnicas que ha surgido mucho en mi investigación es usar devoluciones de llamada. Si bien entiendo el proceso de cómo escribir y ejecutar una función de devolución de llamada, estoy confundido por qué las devoluciones de llamada parecen hacer que la ejecución de JavaScript sea asíncrona automáticamente. Entonces, mi pregunta es: ¿cómo agregar funciones de devolución de llamada a mi código JavaScript hace que dicho código sea asíncrono automáticamente?

Zach Dziura
fuente
2
Quizás le interese leer cómo el navegador logra esto en un solo hilo, escrito por John Resig: ejohn.org/blog/how-javascript-timers-work
Jalayn
@Jalayn. Gracias. Su comentario marcó la diferencia después de leer las diversas respuestas.
kushalvm

Respuestas:

26

No lo hace. Solo tomar una devolución de llamada o pasar una devolución de llamada no significa que sea asíncrono.

Por ejemplo, la .forEachfunción recibe una devolución de llamada pero es sincrónica.

var available = false;
[1,2,3].forEach( function(){
    available = true;
});
//code here runs after the whole .forEach has run,
//so available === true here

El setTimeouttoma una devolución de llamada también y es asíncrono.

function myFunction( fn ) {
    setTimeout( function() {
        fn(1,2,3);
    }, 0 );
}

var available = false;
myFunction( function() {
    available = true;
});
//available is never true here

Conectarse a cualquier evento asíncrono en Javascript siempre requiere una devolución de llamada, pero eso no significa que llamar a funciones o pasarlas siempre sea asíncrono.

Esailija
fuente
2
@SteveEvers Supongo que entonces podrías editar el artículo de MDN . La devolución de llamada es un término muy común en JavaScript para cualquier función pasada a otra que le devuelva la llamada utilizando la función que le dio ... ¿por qué complicarla? Editar: La devolución de llamada también se usa en las especificaciones
Esailija
3
@SteveEvers "la devolución de llamada implica asincronía" es una idiosincrasia de C # / Microsoft. en.wikipedia.org/wiki/Callback_(computer_programming)
Esailija
1
@MikeBrown Supongo que leí demasiado en su perfil y esto : la respuesta más votada ciertamente da una idea de que "las devoluciones de llamada implican asincronía".
Esailija
1
Pero eso dicho @SteveEvers también está mal. Las devoluciones de llamada no implican asincronía, solo que alguien más será responsable de "devolver la llamada".
Michael Brown
1
+1 porque Steve Evers está equivocado
slebetman
23

El secreto de la "magia" es que los eventos a los que está asignando las devoluciones de llamada son asíncronos. Se implementan "bajo el capó" para encargarse de lo que sea que estén haciendo (como recuperar algo de un servidor remoto) en segundo plano, fuera del entorno limitado de JS. Y luego, una vez que han terminado con su trabajo, le dan al motor JS un mensaje para llamar a un evento. Cuando el motor JS termine con lo que sea que esté haciendo actualmente, llamará a cualquier evento que esté en cola (o espere un nuevo mensaje) y luego su devolución de llamada se invocará "mágicamente" de forma asíncrona.

( NOTA: Esta es una visión general conceptual de muy alto nivel del tema que no entra en detalles, porque diferentes motores JS implementarán las cosas de diferentes maneras. Pero esta es la idea general de cómo funciona).

Mason Wheeler
fuente
¿Qué eventos son estos? Un ejemplo de uno o dos de estos eventos mejoraría aún más su respuesta.
Jo Smo