はじめに
Dartでは,dart:async
のFuture.wait()
を使う事で複数の非同期処理を並行して待つことができます.
Flutterなどで,複数のAPIを同時に取得したい時に使えます.
動作確認
DartPadにコピー&ペーストで動作確認できます.
コード
void main() async {
List<Future<bool>> futureList = [];
for (int i = 0; i < 5; i++) {
futureList.add(somethingAPI(i));
}
print('Future.wait() start');
var futureWait = Future.wait(futureList);
print('start await');
var result = await futureWait;
print(result);
print('print end');
}
Future<bool> somethingAPI(int t) async {
print(t.toString() + ' start');
Future<bool> future =
Future.delayed(Duration(seconds: t), () => t%2 == 0 ? true : false);
bool value = await future;
print(t.toString() + ' end');
return value;
}
実行結果
0 start
1 start
2 start
3 start
4 start
Future.wait() start
start await
0 end
1 end
2 end
3 end
4 end
[true, false, true, false, true]
print end
説明
非同期処理のsomethingAPI(int t)
は数秒後に値を返すAPIを想定した関数です.
Future.wait()
にFutureインスタンスをListで渡す事で,そのすべてが完了するまでawait
で待つことができます.
非同期処理の実行結果はFuture.wait()
の戻り値としてListで受け取ることができます.
上記のコードではFuture.wait()
に対するawait
の挙動を確かめたかったので,futureWait
という変数を経由させました.しかし通常は直接await
で受けても良いでしょう.
また,下記の様に.then()
や.catchError()
でチェインさせたりエラーハンドリングを行うことができます.
var futureWait = Future.wait(futureList)
.then(
(content) {
print('.then is called');
return content;
},
).catchError(
(e) {
// do something
throw e;
},
);
Reference
Dart API reference documentation / wait method
解説 Dart 2 プログラミング言語 / 非同期処理-Future (Asynchronous Programming: Futures)
DartのFutureを使って非同期処理を書く