circle-info
Desarrollo en curso, en breve se publicarán el resto de temas.

Capítulo 10: Patrones Avanzados

Este capítulo cubre técnicas avanzadas para escribir código asincrónico robusto y eficiente en aplicaciones reales.

10.1. AbortController: Cancelar peticiones

A veces necesitas cancelar una petición que ya está en curso (navegación rápida, cambio de búsqueda, etc.).

// AbortController permite cancelar peticiones
const controller = new AbortController();

// Pasar la señal a fetch
fetch("/api/datos", {
    signal: controller.signal
});

// Cancelar después de 5 segundos
setTimeout(() => controller.abort(), 5000);

Caso de uso: Búsqueda en vivo

let controladorBusqueda = null;

document.querySelector("#buscar").addEventListener("input", async (e) => {
    // Cancelar búsqueda anterior si existe
    if (controladorBusqueda) {
        controladorBusqueda.abort();
    }
    
    // Crear nuevo controlador
    controladorBusqueda = new AbortController();
    
    const termino = e.target.value.trim();
    
    if (!termino) {
        document.querySelector("#resultados").innerHTML = "";
        return;
    }
    
    try {
        const respuesta = await fetch(
            `/api/buscar?q=${termino}`,
            { signal: controladorBusqueda.signal }
        );
        
        const resultados = await respuesta.json();
        
        // Mostrar resultados solo si no fue cancelado
        document.querySelector("#resultados").innerHTML = resultados
            .map(r => `<div>${r.nombre}</div>`)
            .join("");
        
    } catch (error) {
        // AbortError significa que fue cancelado (no es un error real)
        if (error.name === "AbortError") {
            console.log("Búsqueda cancelada");
        } else {
            console.error("Error:", error);
        }
    }
});

Timeout con AbortController:


10.2. Reintentos y backoff exponencial

Si una petición falla, a menudo queremos reintentar automáticamente.

Backoff exponencial con jitter:


10.3. Peticiones en paralelo: Promise.all con fetch

Cargar múltiples recursos eficientemente:

Promise.allSettled para operaciones parciales:


10.4. Debouncing y throttling en búsquedas

Para evitar hacer demasiadas peticiones mientras el usuario escribe:

Debouncing (esperar a que deje de escribir):

Throttling (máximo una petición cada X ms):


10.5. Caché simple: Evitar peticiones repetidas


Resumen del Capítulo

Los patrones avanzados como AbortController, reintentos, paralel loading, debouncing y caché hacen que tus aplicaciones sean más robustas, rápidas y responsivas. Son técnicas usadas en aplicaciones profesionales reales.

💡 Conceptos Clave:

  • AbortController: Cancelar peticiones en curso

  • Reintentos: Volver a intentar peticiones fallidas

  • Backoff exponencial: Espaciar reintentos progresivamente

  • Promise.all: Cargar múltiples recursos en paralelo

  • Promise.allSettled: Esperar a todas, incluso si fallan

  • Debouncing: Esperar a que deje de escribir

  • Throttling: Máximo una acción cada X ms

  • Caché: Guardar resultados para evitar peticiones

🤔 Preguntas de Reflexión:

  1. ¿Cuándo usarías AbortController?

  2. ¿Cuál es la diferencia entre debouncing y throttling?

  3. ¿Por qué el backoff exponencial es mejor que reintentos inmediatos?

  4. ¿Cómo implementarías caché con expiración?

  5. ¿Cuándo es apropiado usar Promise.all vs Promise.allSettled?

  6. Crea una búsqueda en vivo con debouncing y AbortController.


Última actualización

¿Te fue útil?