Kevin Vargas Murcia
Israel Elias Manjarrez Quimiz
Kyb3r Cipher
Trabajar con código asíncrono en JavaScript tiene varias formas, y una de las más claras y legibles es async y await. Esta sintaxis permite escribir funciones que manejan promesas de manera secuencial, sin perder las ventajas del procesamiento asíncrono. A continuación se explica cómo funciona, cómo se compara con las promesas tradicionales y cómo consumir una API pública paso a paso.
¿Qué es async y await y por qué mejora la legibilidad del código asíncrono?
Cuando se marca una función con la palabra reservada async, esa función automáticamente devuelve una promesa [01:23]. Esto significa que el motor de JavaScript toma el código dentro de ella y lo envía a la sección de Web API, donde se resuelve de forma independiente. Una vez resuelta, el event loop se encarga de devolver el resultado al call stack para que se ejecute el callback correspondiente [00:38].
La diferencia principal frente a las promesas encadenadas con .then() es la legibilidad. Con async y await, los pasos se leen de arriba hacia abajo, como si fueran código síncrono, aunque por debajo siguen siendo asíncronos [01:50].
¿Cómo funciona el flujo con promesas y then?
Antes de pasar a async y await, conviene entender el enfoque tradicional. El fetch es una Web API que también retorna una promesa [02:10]. Al consumir una API pública, por ejemplo la de Rick and Morty, el flujo con promesas luce así:
fetch() pasando la URL del API..then() recibe la respuesta y la convierte a JSON con response.json()..then() toma esa data ya convertida y la utiliza, por ejemplo imprimiéndola en consola..catch() captura cualquier error que ocurra en la cadena.Este patrón funciona correctamente. Al ejecutar la función fetchData(), la consola muestra los primeros veinte personajes que el API devuelve por defecto [04:42].
¿Cómo se transforma esa misma función a async y await?
Para convertir la función anterior se necesitan pocos cambios, pero son significativos [05:20]:
.then() por variables que usan await.El bloque try contiene el código que debe ejecutarse correctamente. Si algo falla, el control pasa automáticamente al bloque catch, que recibe el error [05:55]. Esta estructura es el equivalente directo del .catch() en promesas tradicionales.
Dentro del try, el código queda así:
javascript async function fetchData() { try { const response = await fetch('https://rickandmortyapi.com/api/character'); const data = await response.json(); console.log(data); } catch (error) { console.log(error); } }
La palabra await le indica al motor que debe esperar a que la promesa del fetch se resuelva antes de continuar con la siguiente línea [06:30]. Primero se espera la respuesta del servidor y se guarda en response. Después se espera a que esa respuesta se convierta a JSON y se almacena en data. Finalmente se imprime el resultado.
¿Qué resultado se obtiene al ejecutar la función con async y await?
Al llamar a fetchData() en el navegador, el resultado es idéntico al obtenido con promesas encadenadas: una promesa resuelta de forma exitosa que contiene veinte personajes de Rick and Morty [08:05]. La consola muestra que se trata de una promesa completada, lo que confirma que async y await no cambia el mecanismo interno, solo la forma en que se escribe.
Algunos puntos importantes para recordar:
.catch() para el manejo de errores.Existen múltiples APIs públicas para practicar, como la de Pokémon, Star Wars o Rick and Morty [03:00]. Elegir cualquiera de ellas permite experimentar con fetch, promesas y async/await hasta dominar el flujo asíncrono.
Si ya trabajas con promesas y quieres que tu código sea más fácil de leer y mantener, prueba reescribir tus funciones con async y await y comparte cómo te fue.
Kevin Vargas Murcia
Israel Elias Manjarrez Quimiz
Kyb3r Cipher
Sandra Rosa Arroyo Paredes
Miguel Enrique Velásquez Millán
Sebastián Echeverri Flórez
Miguel Enrique Velásquez Millán
David Elias Gatica Morales
Marco Rodrigo Polo Silva
Sebastián Martínez
Francisco Ebgueny Pérez José
Daniel Vergel
Jose Maldonado
Daniel Andres Rojas Paredes
Platzi
Andres Ng
Juliana Rios
Henry Manolo Gutiérrez Gordillo
Kenneth Angulo L
Roger Alberto Chan Arjona
Marlon de León
David Rangel
Jorge Ivan Martinez Guerra
Jorge Ivan Martinez Guerra
Johanna Marcela Orjuela Flórez
Ana Rotela Cabrera
Matias Ezequiel Rivero
Async y Await en JavaScript
Async y await son dos palabras clave introducidas en JavaScript (ES8) para simplificar la programación asíncrona. Antes de su llegada, se utilizaban promesas para manejar operaciones asíncronas, pero el código podía resultar complejo y difícil de leer.
¿Qué es Async?
await.¿Qué es Await?
await.Ventajas de usar Async/Await:
try...catch para manejar errores de las promesas.En resumen:
Async/await es una sintaxis que hace que el código asíncrono sea más fácil de escribir y leer. Transforma el código asíncrono en un estilo similar al síncrono, lo que mejora la mantenibilidad y legibilidad del código.
gracias por ese resumen
Gracias por la informacon
Async/Await es una forma moderna y más legible de trabajar con código asíncrono en JavaScript. Vamos a repasar los conceptos clave:
Async Function:
async.Await:
Manejo de errores:
Async/Await con loops:
Compatibilidad con Promesas:
¿En la línea número 11 hace falta colocar el await? Entiendo que en la línea 10 se coloque el await porque estamos esperando a que se realice la petición con el fetch, pero una vez esa línea se ejecuta correctamente (y que por tanto tenemos la respuesta en la variable response), ¿sigue siendo necesario usar el await en la siguiente línea con el data? 🤔.
Hola Miguel, sí es necesario el await de la línea 11.
Esto porque el método .json() devuelve una promesa, así que si eliminas await al llamar a .json(), la función fetchData seguirá ejecutándose sin esperar a que se resuelva la promesa de .json() y puedes obtener como respuesta, en vez del json, Promise { <pending> }:
Ohhhhh, qué curioso que el método .json() devuelva una promesa. Pensaba que se trataba de un método normalito, je je je. Eso lo explica.
¡Muchas gracias, Sebastián! ❤️.
Un ejemplo de como funciona asyn y await quitando
el sugar syntax
async function saludar() { return "Hola"; }
Aunque parece que devuelve un string, en realidad:
saludar().then(console.log); // Imprime: Hola
¿Por qué? Porque internamente es igual a esto:
function saludar() { return Promise.resolve("Hola"); }
Las promesas implícitas son aquellas que no se declaran explícitamente, sino que son devueltas por funciones o métodos que internamente manejan operaciones asíncronas y devuelven promesas.
Como hace para ver ese listado en el navegador? Lo itnenté pero al darle click a fetchData me sale la funciín y ya
al escribir "fetchData" en la consola del navegador asegúrate de escribirlo con paréntesis: "fetchData()"
La diferencia entre usar promesas con then y catch frente a async y await es principalmente la legibilidad y el manejo de errores. Ambos métodos logran el mismo resultado, pero:
async/await permite escribir un código que se asemeja más a un flujo secuencial, lo que facilita su comprensión.async/await, se utiliza try/catch, que es más intuitivo y simplifica el manejo de errores en comparación con los múltiples catch que se necesitan con promesas.Ambos enfoques devuelven promesas y funcionan de manera asíncrona, pero la elección entre uno y otro depende más de la preferencia y el contexto del código.
Osea que no es necesario declarar la funcion especificamente como una promesa sino que al aplicar los metodos then and catch, js entiende que esa funcion es una promesa?
Falso. Es necesario crear una instancia de la Promesa para que JS la entienda como tal, no basta con usar then y catch.
Lo que te devuelve una promesa es la funcion fetch.
Mis notas:
Una "promise" en JavaScript es un objeto que representa la eventual finalización (o fallo) de una operación asíncrona y su valor resultante. Permite manejar operaciones asíncronas de manera más organizada y legible, facilitando la escritura de código que puede manejar resultados futuros (que pueden ser exitosos o fallidos) sin caer en el "callback hell". Las "promises" pueden estar en uno de tres estados: pendiente (pending), cumplida (fulfilled) o rechazada (rejected).
¿Dónde encaja esto en el Event Loop?
Aunque async/await hace que el código parezca síncrono, por debajo sigue utilizando la misma arquitectura no bloqueante de JavaScript. Cuando el motor de ejecución encuentra la palabra await, suspende temporalmente la ejecución de esa función específica y delega la tarea (como una petición de red) a las Web APIs del navegador. Mientras el servidor responde, el Call Stack (pila de llamadas) queda libre para seguir ejecutando el resto del código de tu aplicación, evitando que la pantalla se congele. Una vez que la promesa se resuelve, el resultado viaja a través de la cola de microtareas (Microtask Queue) y el Event Loop lo empuja de vuelta al Call Stack en el momento exacto en que esté vacío, retomando la función justo donde la habías pausado.
DUDA como puedo ver la respuesta del navegador desde Visual Studio Code
en que momento configuro su localhost para correr los ejemplos ??
"fetch", "API", "async function", "json" y de la nada menciona rick and morty, me senti perdido, me vi la clase como 10 veces pq no entendia nadota xd
Para hacer este ejercicio con TS, la más grande diferencia es tener que instalar las dependencias que permiten el fetch:
// Async and await /* INSTALAR: npm install --save-dev @types/node-fetch */ // usando then function fetchData() { fetch('https://swapi.dev/api/planets/') .then((response) => { return response.json(); }) .then((data) => console.log(data)) .catch((error) => console.log(error)); } fetchData(); // Usando funcion async await async function fetchDataTwo() { try { let response = await fetch('https://swapi.dev/api/people/'); let data = await response.json(); console.log(data); } catch (error) { console.log(error); } } fetchDataTwo();
.json es una extensión de archivo que se utiliza para almacenar datos en formato JSON (JavaScript Object Notation). Este formato es ligero y fácil de leer tanto para humanos como para máquinas. JSON es comúnmente usado para intercambiar datos entre un servidor y aplicaciones web, ya que es compatible con muchos lenguajes de programación, incluyendo JavaScript, donde se utiliza frecuentemente para manejar datos estructurados. En el contexto de JavaScript, puedes utilizar métodos como fetch para obtener datos en formato JSON desde una API.
Una API, o Interfaz de Programación de Aplicaciones, es un conjunto de reglas y protocolos que permite que diferentes software se comuniquen entre sí. En palabras simples, es como un menú en un restaurante: el menú (API) muestra lo que puedes pedir (funciones) y cómo hacerlo, mientras que la cocina (el sistema) prepara lo que pides sin que tengas que saber cómo se hace. Las APIs son fundamentales para que aplicaciones y sistemas interactúen y compartan datos.
La API de Rick & Morty, al igual que otras APIs, devuelve datos en formato JSON que se pueden mostrar en la consola del navegador. Sin embargo, para visualizar estos datos en un entorno gráfico, como una página web, necesitas implementar código JavaScript que manipule el DOM y muestre los datos en elementos HTML. Por sí sola, la API no mostrará datos en un entorno gráfico; eso requiere programación adicional.
Cuando queremos que nuestras funciones se conviertan en promesas agregamos al inicio async
En los ejemplos de la clase, entiendo que la primer función fetchData() (sin el async) bloquearía el flujo del programa hasta tener la respuesta de la API y la segunda función async fetchData() no bloquea el flujo del programa. Si alguien lo confirma, muchas gracias.