クイックリファレンス

Bluebird.js Promise ライブラリチートシート

Bluebird.jsの構文リファレンス:spread展開、エラーフィルタリング、Promise.join、Promise.all、Promise.props、コールバックのPromise化(promisify)、コルーチン。

· 公開日

Bluebird Bluebird は、標準 ES6 Promise を大幅に上回る実行速度と高度な制御機能を備えた JavaScript / Node.js 向けハイパフォーマンス Promise ライブラリです。

メソッドチェーン概要

promise
  .then(okFn, errFn)
  .spread(okFn, errFn)        // * 配列を展開して関数の個別引数にマッピング
  .catch(errFn)
  .catch(TypeError, errFn)    // * 特定のエラー型に限定したキャッチ処理
  .finally(fn)
  .map(function (e) { /* ... */ })  // * 並行数を制御しながら非同期マッピング処理
  .each(function (e) { /* ... */ }) // * 要素を順次(直列)に非同期処理

** 印の付いたメソッドは、標準 ES6 Promise 仕様を拡張した Bluebird 固有の独自機能です。*


引数展開処理 (Promise.spread)

Promise.resolve(['foo', 'bar'])
  .spread((item1, item2) => {
    console.log(item1, item2); // 'foo', 'bar'
  });

参照:Promise.spread 公式ドキュメント: Promise.spread


固定複数の独立 Promise 結合 (Promise.join)

依存関係のない複数の非同期処理を並行実行し、結果をまとめてハンドリング:

Promise.join(
  getPictures(),
  getMessages(),
  getTweets(),
  (pics, msgs, tweets) => {
    return { pics, msgs, tweets };
  }
);

参照:Promise.join 公式ドキュメント: Promise.join


配列コレクションメソッド

  • Promise.all([p]): すべての Promise が解決した時に完了、1つでも失敗すると即座に reject。
  • Promise.some([p], count): 指定した個数の Promise が成功した時点で即解決。
  • Promise.any([p]): いずれか1つの Promise が成功した時点で即解決。
  • Promise.map(array, fn, { concurrency: 5 }): concurrency オプションで同時実行数を制御しながら配列を非同期マッピング。
Promise.map(urls, url => fetch(url), { concurrency: 3 })
  .then(responses => {
    // 最大3リクエストの同時並行数制限をかけて処理実行
  });

オブジェクト型 Promise 解決 (Promise.props)

オブジェクトのプロパティ値として渡された複数の Promise を並行解決し、同一キーの結果オブジェクトを返却:

Promise.props({
  photos: getPhotos(),
  posts: getPosts()
}).then(result => {
  console.log(result.photos, result.posts);
});

コールバック関数の Promise 化 (Promisification)

従来の Node.js スタイルコールバック関数をワンコールでモダンな Promise に自動変換:

const fs = require('fs');
const Promise = require('bluebird');

// 単一のコールバック関数を Promise 化
const readFile = Promise.promisify(fs.readFile);

// モジュール配下の全メソッドを一括して Async 化
Promise.promisifyAll(fs);
// これで fs.readFileAsync が即座に利用可能になります

コルーチン (Generators / coroutine)

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

関連テーマ