Dart Futureクラスのstatic wait()メソッドについてメモ書き。
wait()は複数のFutureの実行結果を取得するstaticメソッド。
wait()の戻り値はFuture<List<T>>となっており、Futureの実行結果は配列で返される。
第1引数で実行結果を取得するFutureを配列で受け取る。
第2引数はbool型名前付きオプション引数「eagerError:」で、trueを指定するといずれかのFutureがエラーになると即座に終了する。falseを指定すると完了を待ってから終了する。デフォルトはfalse。
第3引数はvoid型名前付きオプション引数「cleanUp:」。「cleanUp:」はエラー時に使用される。wait()で複数のFuture処理を実行し、そのうちの一つがエラーになると成功したFutureはリソースを解放せずに終了してしまう。「cleanUp:」を使用する事で成功したFutureの戻り値を受け取り、リソースを解放することができる。
第2、第3引数はオプション引数なので省略可能。
コーディングで動きを確認。
testTime1()関数とtestTime2()関数をwait()の引数として指定し、実行結果を出力する。
void main() async {
var val = await Future.wait([testTime1(), testTime2()]);
for (var element in val) {
print(element);
}
}
Future<String> testTime1() async {
await Future.delayed(Duration(seconds: 1));
return "testTime1";
}
Future<String> testTime2() async {
await Future.delayed(Duration(seconds: 2));
return "testTime2";
}
実行結果。
testTime1
testTime2
次はtestTime1()関数で意図的にエラーを発生させ、testTime2()関数は正常終了させる。
引数として「eagerError:false 」と「cleanUp:」を追加する。
void main() async {
try {
var val = await Future.wait(
[testTime1(), testTime2()],
eagerError: false,
cleanUp: (successValue) {
print(successValue);
},
// ignore: body_might_complete_normally_catch_error
).catchError((err) {
print(err.toString());
});
for (var element in val) {
print(element);
}
} catch (e) {
print(e.toString());
}
}
Future<String> testTime1() async {
try {
await Future.delayed(Duration(seconds: 1));
throw "test error";
} catch (e) {
rethrow;
}
// ignore: dead_code
return "testTime1";
}
Future<String> testTime2() async {
await Future.delayed(Duration(seconds: 3));
return "testTime2";
}
実行結果。
「cleanUp:」を指定したので、testTime2()関数が正常終了した値を受け取る。
また「eagerError:false 」なので、エラーはtestTime2()関数完了後に返される。
testTime2
test error
Invalid argument(s) (onError): The error handler of Future.catchError must return a value of the future's type
次は「eagerError:true 」を指定。
void main() async {
try {
var val = await Future.wait(
[testTime1(), testTime2()],
eagerError: true,
cleanUp: (successValue) {
print(successValue);
},
// ignore: body_might_complete_normally_catch_error
).catchError((err) {
print(err.toString());
});
for (var element in val) {
print(element);
}
} catch (e) {
print(e.toString());
}
}
Future<String> testTime1() async {
try {
await Future.delayed(Duration(seconds: 1));
throw "test error";
} catch (e) {
rethrow;
}
// ignore: dead_code
return "testTime1";
}
Future<String> testTime2() async {
await Future.delayed(Duration(seconds: 3));
return "testTime2";
}
実行結果。
「eagerError:true 」なのでエラーはtestTime2()関数完了前に返される。
test error
Invalid argument(s) (onError): The error handler of Future.catchError must return a value of the future's type
testTime2
最後は「cleanUp:」を指定せずにエラーを発生させる。
void main() async {
try {
var val = await Future.wait(
[testTime1(), testTime2()],
eagerError: true,
// ignore: body_might_complete_normally_catch_error
).catchError((err) {
print(err.toString());
});
for (var element in val) {
print(element);
}
} catch (e) {
print(e.toString());
}
}
Future<String> testTime1() async {
try {
await Future.delayed(Duration(seconds: 1));
throw "test error";
} catch (e) {
rethrow;
}
// ignore: dead_code
return "testTime1";
}
Future<String> testTime2() async {
await Future.delayed(Duration(seconds: 3));
return "testTime2";
}
実行結果。
クリーンナップ処理が実行されないため、testTime2()関数の結果は出力されない。
test error
Invalid argument(s) (onError): The error handler of Future.catchError must return a value of the future's type
コメント