2020/6/7 Futures and error handling

The Future API and callbacks

FutureAPIの関数は、Futureがcompleteした時の値(あるいはエラー)を処理するコールバック関数を登録します。例えば、

myFunc().then(processValue)
        .catchError(handleError);

then()メソッドのコールバックはFutureが値と共にcompleteした時に実行されます。

catchError()メソッドのコールバックは、Futureがエラーと共にcompleteした時に実行されます。

上記の例では、myFunc()関数の返り値のFutureインスタンスが値と共にcompleteした時、then()メソッドのコールバック(processValue)が実行されます。もしthen()メソッドの中で新たなエラーが発生しない場合、catchError()のコールバックは実行されません。一方で、もしmyFunc()関数がエラーと共にcompleteした場合、then()メソッドのコールバック実行されません。そしてcatchError()メソッドのコールバックが実行されます。


Examples of using then() with catchError()

then()メソッドとcatchError()メソッドをつなげて記述する方法は、Futureを処理する上でよくあるパターンです。そしてそれはtry-catch文と同じように考えることができます。

この後のいくつかのサンプルではこのパターンを見ていきます。

catchError() as a comprehensive error handler

下のサンプルはthen()メソッドのコールバックの中でエラーがスローされて、catchError()でエラーハンドリングする場面です。

myFunc()
  .then((value) {
    doSomethingWith(value);
    ...
    throw("some arbitrary error");
  })
  .catchError(handleError);

もしmyFunc()関数のFutureが値と共にcompleteしたら、then()メソッドのコールバックが実行されます。もしthen()メソッドのコールバックがエラーをスローしたら(上記のサンプルではそうなります)、then()メソッドが返すFutureがエラーと共にcompleteします。そのエラーはcatchError()メソッドで処理されます。

もしmyFunc()関数のFutureがエラーと共にcompleteしたら、then()メソッドが返すFutureもエラーと共にcompleteします。そのエラーもcatchError()メソッドで処理されます。

myFunc()関数内でスローされたエラーも、then()のコールバック内でスローされたエラーも、どちらもcatchError()メソッドにより処理されます。


Error

2020/6/7 dart:async – asynchronous programming

dart:async – asynchronous programming

非同期処理のプログラミングではよくコールバック関数を使って実装しますが、Dart言語では代わりに、FutureクラスとStreamクラスのオブジェクトを使用します。Futureクラスは未来のある時点で結果が提供される「約束」のようなものです。Streamクラスは複数のイベントのような、複数の値を得る方法です。


dart:asyncライブラリはwebアプリとコマンドラインアプリの両方で機能します。ライブラリを使用するときは、dart:asyncライブラリをインポートします。

import 'dart:async';

Version note

Dart2.1からFutureクラスとStreamクラスを使用する際dart:asyncライブラリをインポートする必要はなくなりました。



Future

Futureオブジェクトは、主に非同期なメソッドの返り値として、Dartライブラリの中によく登場します。future(Futureクラスのインスタンス)がcomplete(完了)すると、結果の値を使用することができます。

awaitを使おう(Using await)

Future APIを直接使おうとする前に、awaitを代わりに使用することを考えてください。その方が理解しやすいコードを書くことができます。

下記の関数を考えてみます。runUsingFuture関数は、三つの非同期関数を実行するためにFutureクラスのthen()メソッドを使っています。次の非同期関数を実行する前に、その前の非同期関数の結果を待ちます。

sample1-1

runUsingFuture() {
  // ...
  findEntryPoint().then((entryPoint) {
    return runExecutable(entryPoint, args);
  }).then((exitCode){flushThenExit(exitCode)});
}

 

具体的に、findEntryPoint()関数がcomplete(完了)した時に、その結果を引数entryPointで受け取って、

(entryPoint) {
    return runExecutable(entryPoint, args);
  }

を実行する。runExcutable関数は非同期関数。thenメソッドはFutureインスタンスを返す。その返ってきたfutureがcompleteした時、その結果を引数としてflushThenExit関数に渡して実行される。


sample1-1をawaitを使って書くとsample1-2のようになります。…

2020/3/24 : Dart : Asynchronous programming: futures, async, awaitの訳

Asynchronous programming: futures, async, await

何故非同期なコードが重要なのか?(Why asynchronous code matters)

非同期な処理は、他の処理が終わるのを待つ間、あなたのプログラムを完璧に機能させます。以下に一般的な非同期処理を示します。

  • ネットワークからデータを取ってくる。
  • データベースに書き込む。
  • ファイルからデータを読み込む。

Dartで非同期処理を行うために、Futureクラスとasync、awaitキーワードを使用します。

例:非同期関数の正しく無い使用例

下記のサンプルは非同期関数(fetchUserOrder())の間違った使い方の例です。あとであなたはasync、awaitキーワードを使用してこのサンプルを修正します。このサンプルを実行する前に、どこが間違いなのか考えてみましょう。結果はどうなるでしょうか?

sample1-1

// このサンプルはDartの非同期処理の間違ったコードです。

String createOrderMessage () {
  var order = fetchUserOrder();
  return 'Your order is: $order';
}

Future<String> fetchUserOrder() {
  // Imagine that this 

2020/2/27 Dart Asynchronous programming: futures, async, await

このcodelabでは、非同期処理をfuturesとasync、awaitキーワードを用いて記述する方法を扱います。

このcodelabでは以下の要素を扱います。

  • いつ、どのようにasync、awaitキーワードを使うか
  • 実行の順番がasync、awaitキーワードを使うことでどのようになるか
  • async関数の中で、非同期関数が発するエラーをtry-catch文を使い扱う方法

なぜ非同期処理が重要なのか?(Why asynchronous code matters)

非同期処理を使うことで、別の処理の終了を待っているときのプログラムが完璧にできます。非同期処理を使う場面として

  • ネットワークからデータを取得する
  • データベースに書き込む
  • ファイルからデータを読み込む

Dartで非同期処理を実行するために、Futureクラスとasync、awaitキーワードを使うことができます。

Example:非同期関数の間違った使い方の例

以下(sample1-1)に非同期関数( fetchUserOrder() )の間違った使い方を示します。その後でasync,awaitを使ってこのサンプルを修正します。このサンプルを実行する前に、結果がどうなるか考えてみてください。

sample1-1

String createOrderMessage () {
  var order = fetchUserOrder();
  return 'Your order is: $order';
}

Future<String> fetchUserOrder() {
  // Imagine that this