Hoy · Hoja de ruta
- 1. Aprende: Cómo se piden datos a un servidor y qué puede salir mal.
- 2. Haz: Carga tu catálogo desde una API con sus estados de carga, error y vacío.
- 3. Comprueba: Con la red simulada lenta o caída, tu página se comporta bien.
Antes de empezar · 5 minutos, sin apuntes
- ¿Qué ve tu usuario mientras los datos tardan tres segundos?
- ¿Y si el servidor responde con un error?
- ¿En qué se parece esto a lo que hacías con un cliente HTTP en clase?
Pedir datos
export async function obtenerProductos() {
const respuesta = await fetch("/api/productos");
if (!respuesta.ok) {
throw new Error(`El servidor respondió ${respuesta.status}`);
}
return respuesta.json();
}
Un 404 no rechaza la promesa
fetch solo falla si no hubo respuesta: sin red, DNS caído, petición cancelada. Un 404 o un 500 son una respuesta, así que la promesa se cumple y tu código sigue como si nada, con un cuerpo que no es lo que esperabas.
Por eso la comprobación de respuesta.ok no es opcional: es la línea que convierte un error del servidor en un error de tu programa.
Las dos fases importan: fetch resuelve cuando llegan las cabeceras, y .json() es una segunda promesa que se resuelve al terminar de leer el cuerpo. De ahí los dos await.
Los tres estados de cualquier carga
- Cargando
- Error
- Vacío
- Datos
async function cargar() {
estado.cargando = true;
estado.error = null;
actualizar();
try {
estado.productos = await obtenerProductos();
} catch (error) {
estado.error = "No se pudo cargar el catálogo. Inténtalo de nuevo.";
} finally {
estado.cargando = false;
actualizar();
}
}
El estado que montaste en la sesión 10 ya tenía sitio para cargando y error: la función de render decide qué pintar en cada caso, y ninguna otra parte del código se entera de nada.
El mensaje de error es para la persona; el detalle, para la consola
«No se pudo cargar el catálogo. Inténtalo de nuevo» es útil. «TypeError: Failed to fetch» no lo es, y además cuenta cosas de tu sistema que no hacen falta ahí.
Registra el error técnico con console.error y muestra el mensaje humano, con una salida: reintentar, volver, avisar.
Probarlo de verdad
En DevTools, pestaña Network, puedes simular una red lenta o desconectada. Es la única forma de ver tus estados: con la red local todo va tan rápido que el indicador de carga no se llega a ver.
Comprueba las cuatro situaciones: carga normal, red lenta, sin red y respuesta con error del servidor.
CORS, el error que verás
Si pides datos a otro dominio y no ha dado permiso, el navegador bloquea la respuesta y la consola informa de un error de CORS. No se trata de un defecto del código propio, sino de una política de seguridad del navegador que se resuelve en el servidor. Lo harás tú mismo en la UD6.
Tarea 15 · Catálogo desde la red
- Coloca tu catálogo como fichero
.jsony cárgalo confetch. - Comprueba
respuesta.oky lanza un error con el código de estado. - Añade al estado
cargandoyerror, y píntalos. - Muestra un indicador de carga y un mensaje de error con botón de reintentar.
- Prueba las cuatro situaciones con Network.
- Consume además una API pública real y observa su respuesta.
AbortController cuando llega otra.Cierre de la semana 5
- Explicas por qué JavaScript no espera y qué es una promesa.
- Usas
async/awaitcon errores capturados. - Compruebas
respuesta.oken toda petición. - Tu página contempla cargando, error, vacío y datos.
Ver respuestas
1 · Porque el 404 es una respuesta válida: la promesa se cumple y hay que mirar ok o status.
2 · Cargando, error, vacío y datos.
3 · Es una política del navegador sobre peticiones a otro origen, y se resuelve en el servidor.
Microprueba semanal 5 · 5–10 minutos
Individual, sin IA y sin apuntes.
- Predice el orden de tres líneas con un
setTimeoutde cero milisegundos en medio. - ¿Por qué un 404 no rechaza la promesa de
fetch? Escribe la comprobación que falta. - Nombra los cuatro estados de una carga.