Async await y captura de errores

Clase 16 de 27Curso de Backend con Node.js: API REST con Express.js

Resumen

¿Cómo manejar asincronismo en servicios con Node.js?

Trabajar con servicios en Node.js implica, casi siempre, tratar con asincronismo, especialmente cuando nos conectamos a fuentes de datos externas como API de terceros, bases de datos como MongoDB o PostgreSQL, entre otros. Esto crea un "delay" debido a las conexiones. Aprender a manejar este asincronismo es crucial para evitar bloqueos en nuestras aplicaciones.

¿Qué rol juegan async y await?

Node.js se destaca por su capacidad de ejecutar operaciones de manera asíncrona, y la combinación de async y await simplifica mucho este proceso. Cualquier método que tenga la firma async se considera una promesa, lo que significa que se ejecuta de manera asíncrona.

Para comenzar a trabajar con asincronismo:

  1. Definir métodos como asíncronos: Añade la palabra clave async antes de la declaración de funciones o métodos, aunque actualmente no implementen await. Esto las prepara para futuras conexiones con servicios externos asíncronos.

    async function nombreDelMetodo() {
        // lógica
    }
    
  2. Uso de await: Utiliza await cuando llamas a una función que devuelve una promesa. Esto pausará la ejecución de la función hasta que la promesa se resuelva.

    async function obtenerDatos() {
        const resultado = await fetchDatosExterno();
        // Continua con el procesamiento
    }
    

¿Cómo se emula la asincronía?

Aunque trabajamos en memoria y todo parece ocurrir de forma instantánea, podemos emular un comportamiento asíncrono para prepararnos. Por ejemplo, mediante la simulación de un retraso con setTimeout y las promesas:

async function obtenerProductos() {
   return new Promise((resolve, reject) => {
       setTimeout(() => {
           resolve(this.products);
       }, 5000); // Simula una latencia de 5 segundos
   });
}

¿Cómo podemos manejar errores asíncronamente?

El uso de try...catch en funciones que usan async y await permite manejar errores de manera elegante. Cuando un error es lanzado dentro de un bloque try, el control pasa a la sección catch.

Por ejemplo, para un método que actualiza datos:

async function actualizarProducto(idProducto) {
    try {
        const producto = await buscarProducto(idProducto);
        // Lógica para actualización
    } catch (error) {
        return response.status(404).json({ message: 'Producto no encontrado', error });
    }
}

Ventajas del manejo asíncrono

  • Mejora de rendimiento: Permite que otros procesos de la aplicación continúen ejecutándose mientras se espera la respuesta de un servicio externo.
  • Escalabilidad: Las aplicaciones asíncronas manejan mejor las cargas grandes y simultáneas de usuarios.
  • Elegancia en el manejo de errores: Facilita el uso de try...catch para controlar flujos de error sin interrumpir la ejecución del código.

El uso de async y await ayuda a gestionar las operaciones asíncronas de manera eficiente, permitiendo crear aplicaciones de Node.js más rápidas, escalables y manejables. ¡Imprescindible para cualquier desarrollador en el ecosistema de Node.js! Sigue explorando y aplicando estos conceptos en tus proyectos.