Estrategias de Asincronía en Node.js: Promesas y Generadores

Clase 12 de 26Curso de Node.js Avanzado

Resumen

A medida que profundizas en Node.js, comprender las estrategias para ejecutar código asíncrono se vuelve esencial. Node.js, por naturaleza, se basa en callbacks, pero la implementación moderna favorece cada vez más el uso de promesas y generators, facilitando la escritura de código asíncrono más legible y estructurado.

¿Qué son los callbacks en Node.js?

Node.js maneja tareas asíncronas utilizando callbacks, funciones que se ejecutan al finalizar determinado proceso. Las callbacks permiten continuar con otras tareas sin bloquear la ejecución principal, lo que optimiza el rendimiento del programa.

¿Por qué utilizar promesas para asincronía?

Las promesas simplifican notablemente el manejo de operaciones asíncronas. Son valores futuros pendientes de resolución, que resultan en éxito o error tras concluir su ejecución. Su implementación es preferida actualmente por comodidad y claridad.

  • Facilitan manejar resultados de múltiples operaciones.
  • Ayudan a estructurar mejor el código.
  • Soportan ejecución simultánea usando métodos como Promise.all.

¿Cómo implementar promesas con Promise.all?

Promise.all permite ejecutar múltiples promesas simultáneamente y retornar un resultado cuando todas hayan concluido:

const tarea1 = new Promise(resolve => setTimeout(() => resolve('Tarea 1'), 1000));
const tarea2 = new Promise(resolve => setTimeout(() => resolve('Tarea 2'), 1500));
const tarea3 = new Promise(resolve => setTimeout(() => resolve('Tarea 3'), 2000));

Promise.all([tarea1, tarea2, tarea3])
  .then(resultado => console.log(resultado))
  .catch(error => console.error(error));

Con esta estrategia se ejecutan múltiples tareas asincrónicas sin bloquear el Event Loop, optimizando el uso del potencial completo de Node.js.

¿Cuándo usar generators en Node.js?

Los generators son otra herramienta poderosa para controlar flujos asíncronos, especialmente en tareas secuenciales o iterativas. Mediante la palabra clave yield, puedes pausar y reanudar ejecuciones, lo que es muy útil en iteradores infinitos o secuenciales.

¿Cómo implementar un generator para Fibonacci?

A continuación, un ejemplo para generar la serie de Fibonacci usando generators:

function* fibonacci() {
  let current = 0;
  let next = 1;

  while (true) {
    yield current;
    [current, next] = [next, current + next];
  }
}

const generador = fibonacci();

for (let i = 0; i < 10; i++) {
  console.log('Dentro del ciclo:', generador.next().value);
}

console.log('Fuera del ciclo:', generador.next().value);
console.log('Fuera del ciclo:', generador.next().value);

Cada vez que se invoca yield, el generador pausa su ejecución hasta el siguiente llamado, facilitando la obtención de secuencias potencialmente infinitas sin bloquear el Event Loop.

¿Te animas a probar estas estrategias en tus aplicaciones Node.js o tienes alguna experiencia que compartir? ¡Comenta lo que piensas!