Dart Futureクラスのtimeout()メソッドについてメモ書き。
timeout()はFutureのタイムアウト時間を制御するメソッド。
第1引数にタイムアウト時間をDurationで指定し、第2引数は名前付きオプション引数「onTimeout:」でタイムアウトした場合の処理を記述する。この場合、Future<T>かTを戻り値として返す必要がある。
第2引数を省略した場合、TimeoutExceptionを返す。
コーディングで確認。
以下ケースの場合、testTimeout()関数はFuture<String>を返すため、onTimeout:は戻り値としてStringを指定している。上記で記載している通り、Future<String>でもOK。
void main() {
testTimeout()
.timeout(
Duration(seconds: 1),
onTimeout: () {
return "Timeoutしました。";
},
)
.then((value) => print(value))
.catchError((onError) {
print(onError);
});
}
Future<String> testTimeout() async {
try {
await Future.delayed(Duration(seconds: 2));
return "処理を完了しました";
} catch (e) {
rethrow;
}
}
実行結果。
testTimeout()関数は2秒かかるのに対して、タイムアウト値として1秒を指定しているためタイムアウトとして処理される。
Timeoutしました。
次はonTimeout:を削除する。
コードが見やすいようにtry-catch文も削除。
void main() {
testTimeout()
.timeout(
Duration(seconds: 1),
)
.then((value) => print(value))
.catchError((onError) {
print(onError);
});
}
Future<String> testTimeout() async {
await Future.delayed(Duration(seconds: 2));
return "処理を完了しました";
}
実行結果。
TimeoutExceptionが返る。
TimeoutException after 0:00:01.000000: Future not completed
コメント