Szybka pomoc

Ściąga z kontroli przepływu asynchronicznego co

Krótki przewodnik po bibliotece co w Node.js: generatory, co.wrap, thunki i konwersja obietnic.

· Opublikowano

co co to klasyczna biblioteka kontroli przepływu asynchronicznego oparta na generatorach, która utorowała drogę składni async/await w JavaScript.

Wykonywanie generatorów

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

Funkcja generatora może zwracać przez yield obietnice, thunki, tablice lub obiekty. co() natychmiast wykonuje generator do końca.


Generator do funkcji zwracającej Promise (co.wrap)

Konwertuje generator na standardową funkcję zwracającą obietnicę (odpowiednik nowoczesnej funkcji async):

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

// Wywołanie zwraca zwykłą obietnicę Promise:
getUser(123).then(data => {
  console.log(data);
});

Współpraca z interfejsami callbacków Node.js

Użycie thunkify lub nowoczesnych funkcji promisify:

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

Wykonywanie równoległe (Tablice i Obiekty)

co(function* () {
  // Równoległe rozwiązywanie w tablicy
  const [user, profile] = yield [fetchUser(), fetchProfile()];

  // Równoległe rozwiązywanie w obiekcie
  const data = yield {
    user: fetchUser(),
    profile: fetchProfile()
  };
  console.log(data.user, data.profile);
});

Powiązane tematy