Skip to content

Latest commit

 

History

History
108 lines (75 loc) · 6.57 KB

promise-library.adoc

File metadata and controls

108 lines (75 loc) · 6.57 KB

Promiseのライブラリ

このセクションでは、ブラウザが実装しているPromiseではなく、サードパーティにより作られた Promise互換のライブラリについて紹介していきたいと思います。

なぜライブラリが必要か?

なぜライブラリが必要か?という疑問に関する多くの答えとしては、 その実行環境で「ES Promisesが実装されていないから」というのがまず出てくるでしょう。

Promiseのライブラリを探すときに、一つ目印になる言葉としてPromises/A+互換があります。

Promises/A+というのはES Promisesの前身となったもので、 Promiseの then について取り決めたコミュニティベースの仕様です。

Promises/A+互換と書かれていた場合は then についての動作は互換性があり、 多くの場合はそれに加えて Promise.allcatch 等と同様の機能が実装されています。

しかし、Promises/A+は Promise#then についてのみの仕様となっているため、 他の機能は実装されていても名前が異なる場合があります。

また、then というメソッドに互換性があるということは、Thenableであるということなので、 Promise.resolveを使い、ESのPromiseで定められたpromiseオブジェクトに変換することができます。

Note

ECMAScriptのPromiseで定められたpromiseオブジェクトというのは、 catch というメソッドが使えたり、Promise.all で扱う際に問題が起こらないということです。

Polyfillとライブラリ

ここでは、大きくわけて2種類のライブラリを紹介したいと思います。

一つはPolyfillと呼ばれる種類のライブラリで、 もう一つは、Promises/A+互換に加えて、独自の拡張をもったライブラリです。

Note
Promiseのライブラリは星の数ほどあるので、ここで紹介するのは極々一部です。

Polyfill

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を仕様どおりに実装したものに加えて独自のメソッド等を提供してくれるライブラリです。

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のアンチパターン について書かれています。

どちらのドキュメントも優れているため、このライブラリを使ってない場合でも読んでおくと参考になることが多いと思います。

まとめ

このセクションではPromiseのライブラリとしてPolyfillと拡張ライブラリを紹介しました。

Promiseのライブラリは多種多様であるため、どれを使用するかは好みの問題といえるでしょう。

しかし、PromiseはPromises/A+ または ES Promisesという共通のインターフェースを持っているため、 そのライブラリで書かれているコードや独自の拡張などは、他のライブラリを利用している時でも参考になるケースは多いでしょう。

そのようなPromiseの共通の概念を学び、応用できるようになるのがこの書籍の目的の一つです。