Referencia rápida

Hoja de trucos de control de flujo asíncrono con co

Guía de referencia rápida para co en Node.js: generadores asíncronos, co.wrap, thunks y conversión de promesas.

· Publicado

co co es la clásica biblioteca de control de flujo asíncrono basada en generadores que preparó el camino para la sintaxis async/await en JavaScript.

Ejecución de generadores

const co = require('co');

co(function* () {
  const result = yield Promise.resolve(42);
  return result * 2;
}).then(val => {
  console.log(val); // 84
}).catch(err => {
  console.error(err);
});

Una función generadora puede usar yield con promesas, thunks, arrays u objetos. co() ejecuta el generador de inmediato hasta completarlo.


Generador a función reutilizable con promesa (co.wrap)

Convierte un generador en una función estándar que devuelve una promesa (idéntico a una async function moderna):

const getUser = co.wrap(function* (id) {
  const user = yield db.users.findById(id);
  const posts = yield db.posts.findByUser(user.id);
  return { user, posts };
});

// La llamada devuelve una promesa convencional:
getUser(123).then(data => {
  console.log(data);
});

Trabajo con APIs de callback de Node.js

Uso de thunkify o envoltorios promisificados modernos:

const thunkify = require('thunkify');
const fs = require('fs');

const readFile = thunkify(fs.readFile);

co(function* () {
  const content = yield readFile('config.json', 'utf8');
  console.log(JSON.parse(content));
});

Ejecución en paralelo (Arrays y Objetos)

co(function* () {
  // Resolución paralela dentro de un array
  const [user, profile] = yield [fetchUser(), fetchProfile()];

  // Resolución paralela dentro de un objeto
  const data = yield {
    user: fetchUser(),
    profile: fetchProfile()
  };
  console.log(data.user, data.profile);
});

Temas relacionados