1

Estoy tratando de entender las funciones de callback.

Hasta donde yo llego, la función principal (la función que recibe la función de callback como parámetro) tiene en su interior código asíncrono (que tarda en ejecutarse) y también código no asíncrono (principalmente el código contenido en la función de callback) que queremos que se ejecute cuando termine el código asíncrono (el que tarda en ejecutarase un tiempo indeterminado).

La explicación para el uso de este esquema parece ser el hecho de que Javascript es asíncrono y no espera a que una tarea se complete y continúa con la siguiente o siguientes líneas de código sin esperar a la finalización de aquella.

Mi pregunta es, si en el hilo principal del código, JS no espera a que termine el código asincrónico (lento), ¿por qué JS espera dentro de la función a que termine la tarea lenta antes de ejecutar la función de callback? No lo entiendo. ¿No debería hacer lo mismo, seguir adelante ejecutando el callback antes de terminar? ¿Por qué JS actúa de modo diferente a como actúa en el hilo prinpipal?

¿Es que hay algo especial dentro de la función que llama al callback? ¿Es que JS no es asíncrono dentro de las funciones?

¿Me estoy perdiendo algo o hay algo que no he entendido correctamente y parto de ideas equivocadas?

Gracias por adelantado. Saludos.

Gabrach
  • 57
  • 5
  • No se habla de *hilo principal* en Javascript ya que no existen hilos secundarios. JavaScript es un lenguaje de hilo único. Para responder tu pregunta hay que repasar la teoría asociada al [*loop de eventos*](https://developer.mozilla.org/es/docs/Web/JavaScript/EventLoop) y al [*call stack*](https://developer.mozilla.org/es/docs/Glossary/Call_stack) – Mauricio Contreras Nov 17 '21 at 07:50
  • Muchas gracias por respuesta Mauricio. He consultado las páginas que dices y lo que puedo ver es que como una función ha de ejecutarse completamente antes de volver al hilo único, si tenemos código que lleve mucho tiempo y no queremos que JS siga adelante sin haber terminado, deberíamos meterlo en una función. De este modo al entrar en la función, se detendría la ejecución del hilo único hasta que terminara la función. ¿Es así? – Gabrach Nov 17 '21 at 10:04
  • Pero ello no me explica por qué introducimos una función de callback al final del "código lento". Si el código lento llega a la función de callback antes de haber terminado ejecutará el código antes de tiempo. Se me ocurre que quizá las funciones no se comporten de manera asíncrona, sino síncrona. Entonces lo vería más lógico. ¿Puede ser así o es una tontería lo que digo? Gracias de nuevo. – Gabrach Nov 17 '21 at 10:04
  • Cuando ejecutas código asíncrono, el mismo es enviado a una zona de ejecución que está *al fondo*, (*background*). De esta forma no se bloquea el único hilo con una tarea larga o pesada. La función `callback` que se usa como argumento de la función *pesada*, se ejecutará una vez que el código pesado finalice, muy posiblemente el resultado de la función *pesada* es pasado como argumento a la función *callback*. Otra lectura interesante es: [Introducing Asynchronous Javascript](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Introducing) – Mauricio Contreras Nov 17 '21 at 10:18
  • Con *background* me refiero realmente a la *pila de eventos*. Toma en cuenta que JS como lenguaje solo no posee de forma nativa procesamiento asíncrono, este es implementado por alguna API del motor del intérprete de JavaScript. Por ejemplo, NodeJS utiliza el motor V8 de Google, lo que le da todas las ventajas de asincronía de un navegador como Chrome. – Mauricio Contreras Nov 17 '21 at 10:23
  • De nuevo muchas gracias Mauricio. Se me plantea la duda de, ¿cómo sabe el intérprete de JS que eso es código asíncrono para enviarlo al fondo? – Gabrach Nov 17 '21 at 12:43
  • Y también, si dentro de la función que recibe como parámetro el callback nos encontramos con: 1. Codigo asíncrono 2. Código síncrono 3. Llamada al callback, entiendo que se ejecutará primero el códig asíncrono hasta donde llegue, luego el código síncrono, y finalmente, cuando finalice la parte asíncrona, el callback, ¿no? No habríamos parado la ejecución en espera de respuesta, se hubiera ejecutado el código síncrono que hubiera a continuación de todas formas. – Gabrach Nov 17 '21 at 12:49
  • ¿Sería correcto entender lo siguiente? Cuando JS entra en una función principal con callback y percibe un código asíncrono (una llamada / petición asíncrona), … JS escribe en el “loop de eventos” que se ha efectuado una petición asíncrona, detiene la ejecución de la función y anota qué función de callback ha de ejecutarse cuando se reciba la respuesta. Mientras llega la respuesta JS sigue ejecutando la siguiente línea de código a la llamada a la función principal, no se detiene. Y luego más líneas de código. – Gabrach Nov 17 '21 at 14:15
  • Cuando el loop de eventos recibe la respuesta a la petición asíncrona, detiene el hilo de JS y ejecuta la función de callback correspondiente. Una vez ejecutada la función de callback JS retoma el código en el punto en el que lo dejó. – Gabrach Nov 17 '21 at 14:17

0 Answers0