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