Fetch profesional: contratos HTTP claros y UX resistente
Domina `fetch` en escenarios reales: validación de `response.ok`, parseo seguro, envío de JSON, cancelación de peticiones y manejo de estados UI sin inconsistencias.
La mayoría de bugs con red no aparecen cuando todo va bien, sino cuando el backend responde lento, devuelve error o llega una respuesta fuera de orden.
Trabajar con `fetch` a nivel profesional implica definir contrato HTTP, validar cada respuesta y sincronizar correctamente el estado visual de la interfaz.
En esta lección vas a convertir llamadas sueltas en flujos robustos: inicio, éxito, error, cancelación y limpieza final.
Este bloque se apoya en [javascript-async-pro](/curso/javascript/leccion/javascript-async-pro) y te abre camino para [javascript-formularios-pro](/curso/javascript/leccion/javascript-formularios-pro).
- `fetch` resuelve muchas respuestas con error HTTP; la validación es tu responsabilidad.
- `fetch()` solo rechaza por errores de red o cancelación. Un `404` o `500` normalmente llega como `Response` válida a nivel de promesa.
- Por eso conviene un patrón fijo: pedir, validar `ok/status`, parsear y recién entonces actualizar UI. Saltarte un paso suele romper experiencia y depuración.
- No basta con pedir datos: hay que detectar respuestas inválidas y explicarlas.
- Al consumir endpoints para dashboard o perfiles, un `if (!res.ok)` con error contextual evita que la UI muestre datos vacíos sin explicación.
Contrato HTTP: qué validar siempre antes de renderizar
`fetch` resuelve muchas respuestas con error HTTP; la validación es tu responsabilidad.
`fetch()` solo rechaza por errores de red o cancelación. Un `404` o `500` normalmente llega como `Response` válida a nivel de promesa.
Por eso conviene un patrón fijo: pedir, validar `ok/status`, parsear y recién entonces actualizar UI. Saltarte un paso suele romper experiencia y depuración.
GET robusto: validación + parseo + mensaje útil
No basta con pedir datos: hay que detectar respuestas inválidas y explicarlas.
Al consumir endpoints para dashboard o perfiles, un `if (!res.ok)` con error contextual evita que la UI muestre datos vacíos sin explicación.
Encapsular la lectura en una función reusable te permite centralizar política de error y reducir repetición en toda la app.
- Usa mensaje de error con endpoint y status.
- Mantén `getJson` pequeña y predecible.
- En UI, captura error y muestra texto de recuperación.
POST con JSON y cabeceras explícitas
Para escribir datos, método y payload deben ser inequívocos.
Enviar objetos JavaScript sin `JSON.stringify` o sin `Content-Type` correcto suele generar respuestas inesperadas o validaciones fallidas en backend.
Un patrón claro de creación: construir payload, enviar, validar respuesta y devolver objeto final para que la UI pueda confirmarlo.
Cancelación y race conditions en búsqueda en vivo
Si llegan respuestas fuera de orden, la UI puede mostrar datos viejos.
En inputs de búsqueda, cada tecla puede disparar una petición. Si no cancelas la anterior, una respuesta lenta puede sobrescribir resultados más recientes.
`AbortController` te permite cortar la petición anterior antes de lanzar la nueva y evitar inconsistencias de estado.
Estado UI acoplado al flujo de red
Un buen fetch también se nota en cómo se siente la interfaz.
Antes de pedir datos, muestra estado de carga y bloquea acciones duplicadas; al finalizar, libera controles en `finally` para que siempre vuelvan a estado usable.
Cuando hay error, evita mensajes genéricos. Explica el fallo y ofrece siguiente paso: reintentar, revisar conexión o cambiar filtro.