Artículo original escrito por Dave Gray
Artículo original Async and Await in JavaScript Explained by Making Pizza
Traducido y adaptado por Santiago Yanguas
Async y await pueden parecer complicados... pero son tan fáciles como una tarta de pizza una vez que te sumerges en ellos.
Todos utilizamos async y await en nuestras rutinas diarias.
¿Qué es una tarea asíncrona?
Una tarea asíncrona le permite completar otras tareas mientras la tarea asíncrona sigue trabajando para completarse.
Estos son algunos ejemplos de tareas asíncronas del día a día
Ejemplo 1:
Pides comida en un autoservicio, el cual inicia a procesar su solicitud de comida (una tarea asíncrona).
Avanzas en la fila de conductores (la siguiente tarea), mientras se va preparando su comida.
No había que esperar que la comida estuviera lista para poder avanzar.
Mientras conduces esperas tu comida, la cual se entrega en la ventanilla final.
Ejemplo 2:
Trapeas el suelo de la cocina.
Mientras esperas que se seque el suelo de la cocina, aspiras la alfombra de tu dormitorio.
La tarea original era limpiar el suelo de la cocina y la tarea está completa cuando el suelo está seco.
Estar de pie esperando a que se seque el suelo no es demasiado productivo, así que aspiras el suelo del dormitorio mientras se seca el de la cocina.
Así es como JavaScript maneja también las funciones asíncronas.
Ejemplo de Async/Await - Hornear una pizza congelada
Decides hornear una pizza en tu horno y tu primer paso es precalentar el horno.
Así que sé fijas la temperatura deseada y empiezas a precalentar el horno.
Mientras se precalienta el horno, sacas la pizza del congelador, abres la caja y la pones en una sartén para pizza.
¡Te queda tiempo!
Tal vez, puedes tomar una bebida y ver algo de televisión mientras esperas que el horno emita un ¡beep!, cuando esté listo.
A continuación se muestra un código para simular este ejemplo:
El proceso anterior es exactamente lo que significa async y await.
Mientras await
(esperamos) a que se complete la función asíncrona preCalentarHorno
, podemos realizar tareas síncronas como obtenerPizzaFria
, abrirPizzaFria
, obtenerSartenPizza
, ponerPizzaSarten
, tomarRefresco
e incluso mirarTV
.
Realizamos tareas asíncronas casi todo el tiempo
Así es como funciona también el JavaScript asíncrono
.
Fíjate que cuando await
(esperamos) la respuesta de una función async
(asíncrona) esta debe ser llamada dentro de otra función async
(asíncrona). Eso es lo que vemos arriba cuando hornoListo
es llamado dentro de preCalentarHorno
.
Hay que recordar dos puntos clave:
- JavaScript NO esperará a que una función
async
(asíncrona) comopreCalentarHorno
se complete antes de pasar a las tareas que le siguen comoobtenerPizzaFria
yabrirPizzaFria
. - JavaScript
await
(esperará) a que una funciónasync
(asíncrona) comohornoListo
se complete, devuelva datos antes de pasar a la siguiente tarea dentro de una función asíncrona padre. Vemos esto cuando la sentenciaconsole.log(respuesta)
no se ejecuta hasta quehornoListo
haya devuelto una respuesta.
Si el ejemplo de la pizza no es suficiente...
Sé que los ejemplos cotidianos nos ayudan a algunos, aunque otros pueden preferir el código real.
Por lo tanto, voy a proporcionar un ejemplo menos abstracto de JavaScript async y await que solicita datos con la API Fetch:
Ejemplo de código Async/Await en JavaScript
Conclusión
Espero haberte ayudado a entender async y await en JavaScript.
Sé que puede llevar un tiempo comprenderlo completamente.
Empieza a precalentar la pizza que se te antoja en tu horno y mira algunos ejemplos más de async y await mientras esperas él ¡beep!
Dejo un tutorial de mi canal de YouTube. El video da una explicación más profunda, con más ejemplos de código, incluyendo una discusión de callbacks, promesas, resoluciones y la API Fetch junto con async & await: