La asincronía de JavaScript consiste en delegar algunas tareas para que las ejecute el navegador, una vez esas tareas están terminadas entran en otra estructura llamada Callback queue. En el Callback queue la primera tarea que entra, es la primera en salir. ¿Cómo salen? Mediante el Event Loop.
El Event loop es el encargado de preguntar al Call Stack si ya ha terminado todas sus tareas. Entonces, si y solo si el Call Stack está vacío, el Event loop moverá las funciones que están en el Callback queue para que se ejecuten.
Para entender mejor este término, eetomemos el ejemplo de los tacos, pero ahora tienes un compañero. Entonces tú delegas la tarea de preparar la torta a otra persona, mientras realizas los tacos.
Luego de 5 minutos por cada tarea, entregas las tortas a los clientes correspondientes. Después de 10 minutos necesitas la torta, entonces preguntas ¿ya está lista la torta? Tu ayudante te entrega la torta y se lo entregas. En total fueron 20 minutos y todos los clientes recibieron su pedido. Así funciona la asincronía en JavaScript.
Asincronía en JavaScript
El proceso completo que sigue JavaScript se muestra en la siguiente imagen:
Las Web APIs son herramientas adicionales que te ofrece el navegador para realizar peticiones, modificar el DOM, entre otras. Estas herramientas las puedes observar en el objeto global window.
Ejemplo de asincronía
Rápidamente, la función asíncrona setTimeout consiste en ejecutar otra función en cierto tiempo. Recibe dos valores, la función a establecer un retraso y el tiempo en milisegundos.
Observa el siguiente código y piensa cuál será el resultado:
Esto es porque la función bar salió del Call Stack para esperar asíncronamente un tiempo definido (0 segundos en este caso). Después tendrá que esperar (sin importar el tiempo establecido en setTimeout) hasta que se vacíe el Call Stack para que el Event loop le permita entrar nuevamente al Call Stack para ejecutarse.
El tema de asincronía en JavaScript es muy amplio, aún falta conocer los temas de callbacks, promesas y “async / await” (una estructura de las nuevas versiones de ECMAScript). Por lo que te recomiendo el Curso de Asincronismo con JavaScript.
Contribución creada por Andrés Guano.
Aportes 245
Preguntas 48
Ordenar por:
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
Taquería DeGranda presenta a:
.
🌮 - call stack : el taquero (órdenes rápidas)
👨🍳 - web APIs : la cocina
🌯 - callback queue : las órdenes preparadas
💁♂️ - event loop : el mesero
. a que quedó súper claro el JS Runtime y cómo funciona el asincronismo!? 🤪
Asincronía
Por default corre una tarea a la vez – Sincronismo
Ahora veremos que es el asincronismo
Memory Heap: Espacio donde se guardan funciones y variables
Call Stack: Donde se apilan todas las tareas que tenemos que hacer con Javascript
Web API´s (Ofrecidas por el navegador para manipular lo siguiente)
Dom(document)
AJAX(XMLHttpRequest)
Timeout(setTimeout)
Call Back Queue: El orden en que se van a ejecutar a funciones
Al momento de usar asincronismo sacamos funciones del Call Back Queue que no serán ejecutadas por javascript y serán ejecutadas por el navegador despues
Ejemplo
Me encanta como el profe De Granda explica temas tan técnicos de una manera tan simple para que todos tengan claro cómo funciona.
Encantado con éste curso! 😄
**Asincronismo: **
Cuando hablamos del asincronismo hablamos del siguiente proceso →
En el JS runtime enviroment se comienza a ejecutar nuestro codigo haciendo uso del Memory Heap y el Call Stack.
Pero haciendo uso del Timer una de nuastras Web API’s (API’s del V8 de chrome). Podemos “delegar” codigo que el browser va a ir preparando simultaneamente pero sin ejecutarse todavia. Los resultados de este codigo solo entraran en escena cuando sea autorizado por el Event Loop.
El codigo delegado debe ser guardado bajo el method setTimeout(), este lo pasara por la API Timer. Que organizara el codigo en un Callback Queue
El orden en que se van a ejecutar estas acciones se ubica en el Callback Queue.
Este codigo “delegado”, listo para ejectutarse segun el Callback Queue solo se ejecutara cuando las tareas en el Call Stack esten hechas.
El event loop se encarga de verificar iterativamente si el Call Stack esta vacio, para luego permitir la ejecucion de las acciones en el Callback Queue
pd: No me quedo muy claro si el Timer es una API o no, asi que si tengo mal esa parte sientase libre de corregirme.
Creo que aquí faltó hablar sobre las promesas y las “microtasks queues”, recomiendo esta clase del curso profesional de JS para que vean ese punto. https://platzi.com/clases/1642-javascript-profesional/22169-event-loop/
Cabe resaltar que las “Microtasks queues” tienen preferencia ante la “Callback queue”
La Asincronia se da cuando el JavaScript entrega funciones al navegador para que el las ejecute mientras JavaScrip se sigue ejecuntando con normalida y esto se da en paralelo, cuando el navegador termina de ejecutar lo que le corresponde pone lo que termino en una bandeja de espera, llamada Callback queue endonde el codigo ejecutado esperara su turno para pasar al call Stack y mostrar lo que ejecuto el navegador, antes de motrarse en el callstack interviene algo llamado event loop quien es el encargado de preguntarle al call stack si se encuentra vacio para empezarle a pasar lo que tiene en el callback queue, si el callstack esta ocupado pues seguirán esperando en el callback queue y si esta vacio empezara a recibir esas funciones.
Si el callstack no esta vacion JavaScrip nunca empezara a recibir las funciones que se encuentran en el Callback queue y precisamente el event loop es el encarhado de validar si el callstack esta vacio o no para asi generar la conexion entre el callstack y el callback queue
Hola amigos, encontré un video en donde explica de manera visual mediante la herramienta loupe como se comportan los procesos explicados en este video (Call Stack, Web Apis, Callback Queue, Event Loop), se los recomiendo, lo único que necesitan hacer es introducir código (pueden usar el que el profesor usa) y la herramienta les mostrará de manera dinámica y paso a paso cómo ocurre la “magia”. 😃
Callback Queue: Bandeja de espera (espera a que el Call Stack este vacío).
Event Loop: Observador Funcionamiento
JavaScript delega las tareas pertenecientes del navegador al navegar para continuar ejecutando las funciones que le son propias. En paralelo el navegador comienza a trabajar con esa función y al terminar la colocara en el Callback Queue.
Luego el Event Loop lo que hace es preguntar al Call Stack si termino con sus tareas y esta vació. En caso de que el Call Stack este ocupado con una tarea le dice “no”. En caso de haber terminado con sus tareas, el Event Loop mueve el Fn1 del Callback Queue al Call Stack.
Siempre que queramos ver las funciones de los API que ya vengan por defecto en el navegador, solo tenemos que en consola usar la variable “this” que hace referencia al elemento Window. Varios de estos elementos nos permiten convertir a java en Asíncrono.
Esto se pueda ver como, si tenemos nuestras tareas corriendo pero hay una función que tiene que hacer el navegador o una API. Entonces estas tareas se empezaran a ejecutar simultáneamente con las tareas del JavaScript, entonces las tareas que JS ya haya cumplido, pondrá estas tareas en un CallBack Queue que es como una bandeja de espera que esperara que nuestra Call Stack este vacío. Quien se encarga de preguntar si nuestra Call Stack esta vacío, es el event loop, que preguntara constantemente si el call stack ya termino sus tareas para mover las tareas en el CallBack Queue.
¿Que es?
Es la accion que no ocurre al mismo tiempo CallBack es un asincronismo
Es una pizarra clave para Js asincronismo.
Una funcion que se passa como argumento de otra funcion .
como decir:
¿Que quieres hacer que una vez que tu taera termine? EJEMPLO
Busqué por muchos lados en la web la mejor explicación de como funciona el asíncronismo en JS, pero, hasta que encontre está joya, entendí realmente como funcionaba.
Se van a imprimir primero todos los tacos por que el taquero tiene prioridad, hasta que el taquero no termine todos los tacos, la cocina no puede mandar la torta.
Excelente curso, cabe destacar que el rutime de JS en el navegador no es nada igual al del servidor.
Aunque ambos son JS (Node.js) y ambos corren con el motor V8, obviamente en el lado del servidor no existen las Web API’s, por lo tanto su funcionamiento es diferente.
OJO: Es importante saber que para que las tareas que estén en el callback queue se ejecuten necesariamente el callstack debe estar vacío. Solo así el event loop pasará todas las operaciones del callback queue al callstack para que se puede ejecutar en el orden correcto 😃
Buenas, como estan! Les comparto mi carpeta de Google Docs para que entre todos podamos seguir aportando a la toma de notas de un montón de los cursos de Platzi. Hagamos una comunidad!!!
El profe Diego explica superbien, y se hace entender de una forma muy fácil y concreta. Gracias también a los aportes de los compañeros, ya que la explicación toma nuevas dimensiones y se facilita también entender esta temática con mayor certeza.
Como vimos en la clase 5, JavaScript por defecto es síncrono, es decir que ejecuta una tarea a la vez según estén en el call stack, y mientras no termine de ejecutar una tarea no continua con la otra, esto hace que el proceso sea mucho más lento.
El asincronismo en JavaScript ocurre cuando tenemos ciertas tareas que el navegador va realizando mientras en paralelo el Call Stack va ejecutando otras tareas y las que se van terminando se agregan a una cola de espera (callback queue), mientras las demás se siguen ejecutando, luego cuando todas las tareas están listas termina de ejecutarse el código (event loop). Veamos como funciona mejor.
Guardamos las variables y funciones de JavaScript en el Memory Heap donde esperan a ser llamadas.
Se añaden las tareas a ejecutar al Call Stack
Si implementamos las funciones que nos proporciona el navegador (Web APIs) el Call Stack se las manda al navegador señalandole que tiene tareas por realizar.
Ahora, cuando corre el código, el Call Stack de JavaScript empieza a ejecutar las tareas que tiene mientras el navegador en paralelo va ejecutando las que le corresponden.
Las tareas que estén terminadas, se van añadiendo a la cola de espera (el callback queue) mientras las otras se van ejecutando. Luego que estén listas todas las tareas restantes (las del navegador), pasan del callback queue al call stack donde irán saliendo. -Entonces primero se entregan las tareas que se realizaron inmediatamente y pasan al callback queue, que esperan por las tareas del navegador que se están ejecutando, por lo que primero salen las inmediatas al call stack y luego las que hizo el navegador-.
Luego entra el Event Loop que es el monitor que va checando si ya el callback queue tiene todo listo para mandar la función del navegador al call stack. Luego que el Call Stack ejecute las tareas inmediatas y las del navegador y esté vacío, el código se termina de ejecutar.
A veces es mejor que la cabeza (el call stack) descanse un poco para poder enviar más callback queues (más trabajo) a través de nuestro event loop (esfuerzo).
Les dejo mi apunte, esta muy completo y explica todo lo que el docente dijo, ademas puse informacion que recopile por ahi. Espero les pueda ayudar para entender esto de mejor manera y a profundidad desde la logica.
Para que se de el efecto de Asynchronous, se usan las funciones que el navegador ya tiene (Web APIs).
Cuando JS en el Call Stack tiene una tarea que contiene ** una función que ya tiene el navegador** (objeto global o window), se la manda a esta Web API.
Específicamente, en el ejemplo en clase el JS lo decide mandar por que** contiene la función setTimeout** que el navegador puede ejecutar. Es por eso que aunque el timer en esta función sea cero “0”, se sigue efectuando el proceso de asincronismo, por que entra al Web API y sale al final, cuando se acabaron las tareas en el Call Stack.
Por eso entiendo que si en el código de JS que nosotros ejecutaremos no hay funciones (Web APIs) que el navegador tenga, nunca se hará el efecto Asynchronous.
Aquí dejo un video por si quieren profundizar Link
Una vez que Chrome recibe el código o los scripts javascript en la página web, el motor JS V8 comienza a analizarlo. Primero, analizará parcialmente el código comprobando errores de sintaxis. Si no encuentra ninguno, comienza a leer el código de arriba a abajo. Su objetivo final es convertir el código javascript en código de máquina que la computadora pueda entender. Pero antes de comprender qué hace exactamente con el código, debemos comprender el entorno en el que se analiza.
Event Loop
Tarea asignada para mover del Tas Queue al Stack, Solo si el Stack esta vacío
Memory Heap (Montón)
Donde se almacena los valores de las variables y las funciones
Se destina un espacio en memoria para las variables.
La información en el memory heap, No se guarda de manera lineal
EL MONTÓN
El primer contenedor en el entorno, que también forma parte del motor V8 JS Engine, se denomina “montón de memoria”. A medida que el motor JS V8 encuentra variables y declaraciones de funciones en el código, las almacena en el montón .
Call Stack (Pila) = El ultimo que entra es el primero en salir
Como se mandan a llamar las variables y las funciones
Las tareas en el callstack se apilan de abajo hacia arriba.
Se llaman de la última que mandamos a llamar hacia abajo
En la base de la pila reposa el Global Object
Si una función llama a otra, la pone encima de la pila.
Se ejecuta una tarea a la vez (sincronía)
Una vez que se van ejecutando las tareas se van retirando de la pila
Al ejecutar todas las tareas se retira el Global object.
LA PILA
El segundo contenedor en el entorno se denomina “pila de llamadas”. También es parte del motor JS V8. Cuando JS Engine encuentra un elemento procesable, como una llamada a función, lo agrega a la pila .
Task Queue (Cola) = El primer que entra es el primero en salir
Cola de tareas, se maneja la concurrencia, se agregan las tareas que ya están listas para pasar el stack (Pila). El stack debe de esta vacío
MicroTask Queue (Micro Tareas)
Las promesas tienen otra forma de ejecutarse y una prioridad superior
Web APIs
JavaScript del lado del cliente: setTimeout, XMLHttpRequest, File reader, DOM
Node: fs, https
Garbage Collection
limpia la memoria de los datos no utilizados para no sobrecargarla y seguir trabajando sin problemas.
- Las funciones por defecto/default de window se las da al navegador!!!, no las ejecuta el motor de javascript
- El motor de javascript sigue ejecutando las tareas que el tiene
- Cuando terina el navegador pone las tareas en un callback queue para que cuando termine el motor de javascript de ejecutar
sus tareas las mueva
- Hay un EVENT LOOP que se encarga de estar preguntando a javascript si ya termino de ejecutar sus tareas
El Event loop es una cola de funciones. Cuando se ejecuta una función asíncrona, la función devuelve el código interno de la función, lo envuelve y se inserta en una cola.
El motor de JavaScript manda las operaciones a la cola y hace que se procesen en segundo plano para no bloquear las demás operaciones.
Mi resumen de la clase
![](https://static.platzi.com/media/user_upload/Captura%20de%20Pantalla%202024-06-15%20a%20la%28s%29%2015.35.33-c1adf35f-496e-4478-a54c-3142cd3f07eb.jpg)
La forma en la que explica Diego de Granda es sencillamente excepcional, este tema personalmente era algo que me costaba entender desde hace un tiempo y en 11 minutos no me lo pudo haber hecho entender mejor.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?