Bluebird Bluebird — это высокопроизводительная библиотека промисов с богатым набором возможностей для JavaScript и Node.js.
Цепочки вызовов методов
promise
.then(okFn, errFn)
.spread(okFn, errFn) // * Распаковывает массив в отдельные аргументы
.catch(errFn)
.catch(TypeError, errFn) // * Фильтрованный перехват по типу ошибки
.finally(fn)
.map(function (e) { /* ... */ }) // * Параллельная итерация с ограничением
.each(function (e) { /* ... */ }) // * Последовательная итерация
*Методы, отмеченные , являются расширениями Bluebird, выходящими за рамки стандарта ES6.
Распаковка аргументов (Promise.spread)
Promise.resolve(['foo', 'bar'])
.spread((item1, item2) => {
console.log(item1, item2); // 'foo', 'bar'
});
См.: Документация Promise.spread: Promise.spread
Объединение независимых промисов (Promise.join)
Координирует несколько независимых промисов с фиксированной сигнатурой:
Promise.join(
getPictures(),
getMessages(),
getTweets(),
(pics, msgs, tweets) => {
return { pics, msgs, tweets };
}
);
См.: Документация Promise.join: Promise.join
Методы для работы с массивами промисов
Promise.all([p]): Завершается, когда все промисы выполнены успешно, или отклоняется при первой же ошибке.Promise.some([p], count): Завершается, когда успешно выполнено указанное количество промисов.Promise.any([p]): Завершается, как только успешно выполнен любой первый промис.Promise.map(array, fn, { concurrency: 5 }): Асинхронное отображение элементов с контролем параллелизма.
Promise.map(urls, url => fetch(url), { concurrency: 3 })
.then(responses => {
// Обработка ответов с ограничением максимум в 3 одновременных запроса
});
Промисы объектов (Promise.props)
Разрешает объект, свойства которого являются промисами, в объект с готовыми значениями:
Promise.props({
photos: getPhotos(),
posts: getPosts()
}).then(result => {
console.log(result.photos, result.posts);
});
Промисификация (Promisification)
Преобразование классических функций с колбэками Node.js в современные промисы:
const fs = require('fs');
const Promise = require('bluebird');
// Промисификация отдельной функции
const readFile = Promise.promisify(fs.readFile);
// Промисификация всего модуля целиком
Promise.promisifyAll(fs);
// Теперь метод fs.readFileAsync доступен для прямого вызова
Корутины (Генераторы)
const loginUser = Promise.coroutine(function* (email, password) {
const user = yield User.findOne({ email }).exec();
const valid = yield user.comparePassword(password);
if (!valid) throw new Error('Invalid credentials');
return user;
});