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()メソッドにより処理されます。