Referință rapidă

Fișă recapitulativă pentru controlul fluxului asincron cu co

Ghid de referință rapid pentru co în Node.js: execuția generatoarelor, co.wrap, funcții thunk și conversia promisiunilor.

· Publicat

co co este biblioteca clasică de control asincron al fluxului bazată pe generatoare, care a deschis calea pentru sintaxa modernă async/await în JavaScript.

Executarea generatoarelor

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

O funcție generator poate face yield pe promisiuni, thunk-uri, tablouri sau obiecte. co() execută generatorul până la finalizare.


Conversie generator în funcție cu promisiune (co.wrap)

Transformă un generator într-o funcție standard care returnează o promisiune (identic cu o funcție async modernă):

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

// Apelul returnează o promisiune standard:
getUser(123).then(data => {
  console.log(data);
});

Lucrul cu API-urile pe bază de callback din Node.js

Utilizarea thunkify sau a wrapper-elor moderne promisified:

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

Execuție paralelă (Tablouri și Obiecte)

co(function* () {
  // Rezolvare paralelă în tablou
  const [user, profile] = yield [fetchUser(), fetchProfile()];

  // Rezolvare paralelă în obiect
  const data = yield {
    user: fetchUser(),
    profile: fetchProfile()
  };
  console.log(data.user, data.profile);
});

Subiecte conexe