logo header
logo header
logo header
logo header
  • 2014.09.18
  • 技術ブログ

Dartでの非同期処理(FutureとStream)

Dartには標準ライブラリとしてdart:asyncというものが用意されており、非同期処理に関する機能を利用することができます。

今回は、その中でもFutureStreamというクラスについてご紹介します。

Future

Futureクラスは、何らかの非同期処理の結果を1回限りで受け取りたいようなケースで使用します。

HTTPアクセスやファイルアクセスなどがそのケースに相当し、実際にDartの標準ライブラリdart:htmlにあるHttpRequestクラスでも使用されています。

上記の例では、HttpRequestrequestというstaticなメソッドがFutureのインスタンスを返し、そのFuturethenというメソッドに関数を渡しています。

HTTPリクエストが返ってきた時に、thenで設定した関数が呼ばれます。

この例だけですと、ただのListenerのような結果を返す関数を呼ぶだけのものと変わり無いように見えますが、機能はこれだけではなく、エラーハンドリングや、複数の非同期処理を同時もしくはシーケンスに扱う際などで便利な機能もあります。

このようなFutureのインスタンスを返すような非同期処理を行う関数を自前で作ることも可能です。

Stream

StreamクラスはFutureとは違い、複数の結果を継続的に返すような非同期処理で使用します。

Streamという名前からわかるように、あるデータを小分けして受け取るような場合で用いられることが想定されていますが、イベントハンドリングでも使用されています。

Dartの標準ライブラリdart:htmlのDOMのElementのイベントでも使用されています。

上記の例では、ElementonKeyDownプロパティそのものがStreamとなっています。(厳密には拡張されたElementStreamというものが使用されています)

Streamからのイベントを受け取る場合は、Streamlistenメソッドを使用します。

こちらもFutureと同様に、Streamを返してイベントを発行するようなものを自前で作ることも可能です。

このように、Dartでは昨今の非同期処理の需要の高まりに応える形で、多機能で効果的な非同期処理のための仕組みを用意してあります。

参考

※アイキャッチの画像は https://www.dartlang.org/logos/ こちらで配布されている画像をCC BY 3.0のライセンスに基づき利用させていただきました。

ともに世界をアップグレードできる、そんな日を夢見て。
Upgrade the World!