Référence rapide

Antisèche du contrôle de flux asynchrone co

Guide de référence rapide pour co dans Node.js : exécution de générateurs, co.wrap, thunks et conversion en promesses.

· Publié le

co co est la bibliothèque classique de contrôle de flux asynchrone basée sur les générateurs, précurseur de la syntaxe async/await en JavaScript.

Exécution des générateurs

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);
});

Un générateur peut suspendre son exécution (yield) sur des promesses, thunks, tableaux ou objets. co() exécute le générateur jusqu'à son terme.


Convertir un générateur en fonction réutilisable (co.wrap)

Transforme un générateur en une fonction standard retournant une promesse (identique aux fonctions async modernes) :

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

// L'appel retourne une promesse standard :
getUser(123).then(data => {
  console.log(data);
});

Gestion des callbacks Node.js

Utilisation de thunkify ou de wrappers promisifiés modernes :

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));
});

Exécution parallèle (Tableaux et Objets)

co(function* () {
  // Résolution en parallèle dans un tableau
  const [user, profile] = yield [fetchUser(), fetchProfile()];

  // Résolution en parallèle dans un objet
  const data = yield {
    user: fetchUser(),
    profile: fetchProfile()
  };
  console.log(data.user, data.profile);
});

Sujets associés