Parse(数ヶ月前にFacebookが買収)がAndroidとiOS用の低レベルライブラリをまとめて、Boltsと名づけてオープンソース化した。Parseの発表によると、BoltsはParse/Facebookの共同成果であり、両社が独自に開発してきた小さな低レベルのユーティリティクラスを固めたものだ。
GitHubで公開された最初のBoltsコンポーネントはTasksで、JavaScript Promiseモデルにしたがった非同期操作を目的としている。
Promiseはコールバックを使って非同期操作を処理するときによく見られる数々の問題、特に複数のシリアルあるいはパラレルな非同期操作をやろうとすると、コールバック内で非同期操作をネストするせいですぐに面倒なことになるという問題を解決しようとしている。
この目的のために、Promiseは完了するかもしないかもしれない、最終的にエラーになるおそれもあるタスクの結果を表現するもので、非同期操作はその実行結果として即座にPromiseを返すことができる。Promiseはいつでもアクセスすることができ、非同期操作がまだ完了していなければブロックすることができる。
通常、Promiseには2つのコールバック、非同期タスクが完了したときに呼ばれるコールバックと失敗したときに呼ばれるコールバックを関連付ける。Promiseの独特なところは、コールバック自体がPromiseにカプセル化されていることだ。もとのPromiseで起こることに依存して、コールバックは将来のある時点で実行されるか、あるいはまったく実行されないことになる。
上の図にあるように(出典: Promises, Luke Smith)、この仕組みのおかげで、Promiseをつなげて非同期操作とそのコールバックを表現することができるので、一連の非同期操作は扱いやすくなる。
Promiseのもう1つの利点は、Promiseのチェーンをエラーが伝搬するところにある。Promiseはそれが満たされたか否かを知っており、エラーハンドラが見つかるまでエラー状態はPromiseのチェーンを伝播することになる。そのため、チェーンに含まれる非同期操作ごとにエラーハンドラを用意する必要はない。
Promisesの実装はJavaScript、Scala、Clojureなど、多数の言語で利用できる。
Parseによると、TasksにはAndroidのAsyncTaskやiOSのNSOperationよりも、さまざまなメリットがあるという。
- 複数のタスクを連続実行をしても、コールバックのみを使った場合に起こるネストされた「ピラミッド」コードにはならない。
- Tasksは完全に構成可能であり、分岐、平行処理、複雑なエラーハンドリングが実行できる。
- タスクベースのコードを実行される順番に並べることができ、ロジックをコールバック関数に散らばらせる必要がない。
BoltsコンポーネントはParseやFacebookのサービスとはまったく関係がなく、利用するのにParseやFacebookの開発者アカウントは必要ない。
さらなるBoltsコンポーネントが発表されているが、Parseはまだ詳細をリリースしていない。