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

Capítulo 11: Buenas Prácticas

Este capítulo final, antes del proyecto integrador, debe permitirnos consolidar los patrones profesionales que permiten escribir código asincrónico mantenible, escalable y robusto.

11.1. Centralizar llamadas a APIs (módulos)

En lugar de hacer peticiones fetch esparcidas por el código, crea un módulo API centralizado:

// api.js - Módulo centralizado para todas las peticiones

const API_BASE = "https://api.example.com";

// Configuración global
const defaultOptions = {
    headers: {
        "Content-Type": "application/json"
    }
};

// Función base para todas las peticiones
async function apiCall(endpoint, opciones = {}) {
    const url = `${API_BASE}${endpoint}`;
    
    const config = {
        ...defaultOptions,
        ...opciones,
        headers: {
            ...defaultOptions.headers,
            ...opciones.headers
        }
    };
    
    try {
        const respuesta = await fetch(url, config);
        
        // Manejo centralizado de errores HTTP
        if (!respuesta.ok) {
            const error = new Error();
            error.status = respuesta.status;
            error.statusText = respuesta.statusText;
            throw error;
        }
        
        return await respuesta.json();
        
    } catch (error) {
        console.error(`Error en ${endpoint}:`, error);
        throw error;
    }
}

// Funciones específicas (abstractas)
const usuarios = {
    obtenerTodos: () => apiCall("/usuarios"),
    obtenerPor: (id) => apiCall(`/usuarios/${id}`),
    crear: (datos) => apiCall("/usuarios", {
        method: "POST",
        body: JSON.stringify(datos)
    }),
    actualizar: (id, datos) => apiCall(`/usuarios/${id}`, {
        method: "PUT",
        body: JSON.stringify(datos)
    }),
    eliminar: (id) => apiCall(`/usuarios/${id}`, {
        method: "DELETE"
    })
};

const posts = {
    obtenerTodos: () => apiCall("/posts"),
    obtenerPorUsuario: (userId) => apiCall(`/posts?userId=${userId}`),
    crear: (datos) => apiCall("/posts", {
        method: "POST",
        body: JSON.stringify(datos)
    })
};

// Exportar
export { usuarios, posts };

Uso desde la aplicación:


11.2. Manejo consistente de errores

Crea patrones consistentes para errores:

Uso:


11.3. Separar lógica de datos de renderizado

Usa la arquitectura Presentación-Lógica-Datos (PLD):


11.4. Testing de código asíncrono

Con Jest u otro framework, debes esperar a que terminen las Promises:


11.5. Evitar antipatrones comunes

❌ Antipatrón 1: Múltiples await secuenciales sin necesidad

❌ Antipatrón 2: No manejar rechazos

❌ Antipatrón 3: Mezclar .then() y async/await

❌ Antipatrón 4: No limpiar recursos


Resumen del Capítulo

El código profesional requiere centralización, consistencia y claridad. Usa módulos API, manejo uniforme de errores, separación de responsabilidades y siempre prueba tu código asincrónico.

💡 Conceptos Clave:

  • Módulos API: Centralizar llamadas

  • Manejo consistente: Patrones predecibles

  • Separación: Datos, lógica, presentación

  • Testing: Esperar a Promises, mocksear fetch

  • Antipatrones: Qué evitar

  • Limpiar recursos: AbortController, timeouts

  • Documentación: Explicar comportamiento asincrónico

  • Logging: Rastrear operaciones

🤔 Preguntas de Reflexión:

  1. ¿Por qué centralizar llamadas API?

  2. ¿Cómo estructurarías el manejo de errores?

  3. ¿Cuál es la ventaja de separar datos de presentación?

  4. ¿Cómo testearías una función asincrónica?

  5. ¿Cuáles son los antipatrones más comunes?

  6. Crea un módulo API reutilizable y testeable.


Última actualización

¿Te fue útil?