このセクションでは、ブラウザが実装しているPromiseではなく、サードパーティにより作られた Promise互換のライブラリについて紹介していきたいと思います。
なぜライブラリが必要か?という疑問に関する多くの答えとしては、 その実行環境で「ES Promisesが実装されていないから」というのがまず出てくるでしょう。
Promiseのライブラリを探すときに、一つ目印になる言葉としてPromises/A+互換があります。
Promises/A+というのはES Promisesの前身となったもので、
Promiseの then
について取り決めたコミュニティベースの仕様です。
Promises/A+互換と書かれていた場合は then
についての動作は互換性があり、
多くの場合はそれに加えて Promise.all
や catch
等と同様の機能が実装されています。
しかし、Promises/A+は Promise#then
についてのみの仕様となっているため、
他の機能は実装されていても名前が異なる場合があります。
また、then
というメソッドに互換性があるということは、Thenableであるということなので、
Promise.resolveを使い、ESのPromiseで定められたpromiseオブジェクトに変換することができます。
Note
|
ECMAScriptのPromiseで定められたpromiseオブジェクトというのは、
|
ここでは、大きくわけて2種類のライブラリを紹介したいと思います。
一つはPolyfillと呼ばれる種類のライブラリで、 もう一つは、Promises/A+互換に加えて、独自の拡張をもったライブラリです。
Note
|
Promiseのライブラリは星の数ほどあるので、ここで紹介するのは極々一部です。 |
Polyfillライブラリは読み込むことで、IEといったPromiseが実装されていないブラウザ等でも、 Promiseと同等の機能を同じメソッド名で提供してくれるライブラリのことです。
つまり、Polyfillを読みこめばこの書籍で紹介しているコードは、 Promiseがサポートされてない環境でも実行できるようになります。
- zloirock/core-js
-
ECMAScriptやウェブ標準で定義されている仕様を実装したPolyfillライブラリです。 多種多様な機能のPolyfillが含まれており、その一つとしてPromiseのPolyfillが実装されています。 Babelのプリセットにも組み込まれています。
- jakearchibald/es6-promise
-
ES6(ES2015) Promisesと互換性を持ったPolyfillライブラリです。 RSVP.js という Promises/A+互換ライブラリがベースとなっており、 これのサブセットとしてES6 PromisesのAPIだけが実装されているライブラリです。
- taylorhakes/promise-polyfill
-
ES Promisesのpolyfillとなることを目的としたライブラリです。 実行環境にネイティブのPromiseがある場合はそちらを優先し、上書きしないようにしています。
Promiseを仕様どおりに実装したものに加えて独自のメソッド等を提供してくれるライブラリです。
Promise拡張ライブラリは本当に沢山ありますが、以下の2つの著名なライブラリを紹介します。
- kriskowal/q
-
Q
と呼ばれるPromisesやDeferredsを実装したライブラリです。 2009年から開発されており、Node.js向けのファイルIOのAPIを提供する Q-IO 等、 多くの状況で使える機能が用意されているライブラリです。 - petkaantonov/bluebird
-
Promise互換に加えて、キャンセルできるPromiseや進行度を取得できるPromise、エラーハンドリングの拡張検出等、 多くの拡張を持っており、またパフォーマンスにも気を配った実装がされているライブラリです。
Q と Bluebird どちらのライブラリもブラウザでも動作する他、APIリファレンスが充実しているのも特徴的です。
QのドキュメントにはjQueryがもつDeferredの仕組みとどのように違うのか、移行する場合の対応メソッドについても Coming from jQuery にまとめられています。
BluebirdではPromiseを使った豊富な機能に加えて、エラーが起きた時の対処法や Promiseのアンチパターン について書かれています。
どちらのドキュメントも優れているため、このライブラリを使ってない場合でも読んでおくと参考になることが多いと思います。