co co — это классическая библиотека асинхронного управления на базе генераторов, проложившая путь для современного синтаксиса async/await в JavaScript.
Выполнение генераторов
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);
});
Функция-генератор может приостанавливать выполнение (yield) на промисах, санках (thunks), массивах и объектах. co() выполняет генератор до завершения.
Обертка генератора в функцию с промисом (co.wrap)
Преобразует генератор в стандартную функцию, возвращающую обычный промис (аналог современной async function):
const getUser = co.wrap(function* (id) {
const user = yield db.users.findById(id);
const posts = yield db.posts.findByUser(user.id);
return { user, posts };
});
// Вызов возвращает стандартный промис:
getUser(123).then(data => {
console.log(data);
});
Работа с колбэк-API в Node.js
Использование thunkify или современных промисифицированных оберток:
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));
});
Параллельное выполнение (Массивы и Объекты)
co(function* () {
// Параллельное разрешение задач в массиве
const [user, profile] = yield [fetchUser(), fetchProfile()];
// Параллельное разрешение задач в объекте
const data = yield {
user: fetchUser(),
profile: fetchProfile()
};
console.log(data.user, data.profile);
});