Duración estimada: 2 horas
Objetivos de aprendizaje
- Comprender qué son las promesas y sus estados: pending, fulfilled, rejected
- Usar .then() y .catch() para encadenar operaciones asíncronas
- Consumir datos de APIs externas usando fetch
- Escribir código asíncrono legible con async/await
- Manejar errores de red y respuestas HTTP en peticiones asíncronas
Sesión 22 - JavaScript: Promesas, fetch y async/await
Contenidos de la Sesión
En esta sesión se introdujo la programación asíncrona moderna en JavaScript a través de cuatro bloques clave:
- Promesas y su máquina de estados (
pending,fulfilled,rejected) fetchpara consumir endpoints externos.then()/.catch()para encadenar operaciones asíncronasasync/awaitcomo sintaxis más legible (syntax sugar) sobre promesas
El objetivo principal fue entender que, cuando una operación tarda (red, archivos, temporizadores), JavaScript no se bloquea: devuelve una promesa y el resultado se maneja después.
1. Promesas y máquina de estados
Una promesa representa el resultado futuro de una operación asíncrona.
Estados posibles:
pending→ la operación sigue en cursofulfilled→ la operación terminó bienrejected→ la operación falló
const promesa = new Promise(function (resolve, reject) {
const ok = true;
if (ok) {
resolve("Todo correcto");
} else {
reject(new Error("Algo ha fallado"));
}
});
Important
Una promesa solo puede resolverse o rechazarse una vez.
Después de eso, su estado ya no cambia.
2. Trabajar con promesas usando .then() y .catch()
Cuando una promesa se cumple, usamos .then().
Cuando falla, usamos .catch().
promesa
.then(function (resultado) {
console.log("Éxito:", resultado);
})
.catch(function (error) {
console.error("Error:", error.message);
});
.then() también devuelve otra promesa, lo que permite encadenar pasos:
obtenerUsuario()
.then(function (usuario) {
return obtenerPosts(usuario.id);
})
.then(function (posts) {
console.log("Posts:", posts);
})
.catch(function (error) {
console.error(error);
});
Tip
Si dentro de un .then() necesitas pasar datos al siguiente paso, recuerda hacer return.
3. fetch: peticiones HTTP a endpoints externos
fetch(url) devuelve una promesa con un objeto Response.
fetch("https://jsonplaceholder.typicode.com/users")
.then(function (response) {
return response.json(); // también devuelve una promesa
})
.then(function (users) {
console.log(users);
})
.catch(function (error) {
console.error("Fallo de red o parseo:", error);
});
response.json() es asíncrono porque convertir la respuesta a JSON puede tardar.
Warning
fetch solo rechaza automáticamente en errores de red.
Si el servidor responde 404 o 500, la promesa puede seguir resuelta.
Conviene comprobar response.ok.
Ejemplo robusto:
fetch("https://jsonplaceholder.typicode.com/users")
.then(function (response) {
if (!response.ok) {
throw new Error("HTTP " + response.status);
}
return response.json();
})
.then(function (users) {
console.log(users);
})
.catch(function (error) {
console.error(error.message);
});
4. async/await: la misma idea con sintaxis más simple
async/await no reemplaza promesas: las usa por debajo.
Simplemente permite escribir código asíncrono con estilo más cercano a código secuencial.
async function cargarUsuarios() {
try {
const response = await fetch("https://jsonplaceholder.typicode.com/users");
if (!response.ok) {
throw new Error("HTTP " + response.status);
}
const users = await response.json();
console.log(users);
} catch (error) {
console.error(error.message);
}
}
cargarUsuarios();
Relación directa:
awaitespera una promesa (equivale a un.then())try/catchcaptura errores (equivale al.catch())
Note
await solo se puede usar dentro de funciones async (o en top-level await en módulos compatibles).
5. Resumen rápido
- Promesas: resultado futuro de operaciones asíncronas
- Estados:
pending→fulfilled/rejected .then()y.catch(): forma clásica de encadenar promesasfetch: API nativa para peticiones HTTPasync/await: syntax sugar para trabajar con promesas con mejor legibilidad
Recursos adicionales
Ejercicios prácticos
-
1. Consumir una API pública con fetch
Crea una aplicación que obtenga datos de una API pública (ej: JSONPlaceholder) y los muestre en la página.
-
2. Convertir promesas clásicas a async/await
Toma ejemplos con .then()/.catch() y reescríbelos usando async/await.