Краткий справочник

Шпаргалка по библиотеке промисов Bluebird.js

Краткое руководство по Bluebird.js: spreads, перехват ошибок, Promise.join, Promise.all, Promise.props, промисификация и корутины.

· Опубликовано

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

Связанные темы