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