Dartの勉強11−2:同期・非同期(.then)(まとめてawait)
まずは、このコードを見てみようか。
=async/awaitを使わない= FuturefetchUserData() { return Future.delayed(Duration(seconds: 2), () => 'User Data'); } void main() { fetchUserData().then((data) { print(data); // 2秒後に "User Data" が表示される }); } =async/awaitを使うとこうなる= Future fetchUserData() async { return await Future.delayed(Duration(seconds: 2), () => 'User Data'); } void main() async { var data = await fetchUserData(); print(data); // 2秒後に "User Data" が表示される }
ということで、.thenは、処理結果を待ってから動き始める(コールバックベースの非同期処理を記述する方法)ので、async/awaitが不要になるということのようだ。正確にいうと、即座にFutureが返され、処理結果は終わってから返すという仕組みとのことです。
こんな感じで続けて.thenを使うことも可能だということです。
FuturefetchUserData() { return Future.delayed(Duration(seconds: 2), () => 'User Data'); } void main() { fetchUserData().then((data) { print('Fetched: $data'); // 2秒後に "Fetched: User Data" が表示される return data.toUpperCase(); // 結果を大文字に変換して次のthenに渡す }).then((modifiedData) { print('Modified: $modifiedData'); // "Modified: USER DATA" が表示される }); }
処理結果が大玉送りみたいに、次へ次へと送られていくようなイメージという理解でいいのかなぁ。
先生によれば、注意事項が2つ
1.シンプルな処理やコールバックが少ない場合は.then() で十分。複雑な非同期処理や複数の非同期処理を順序立てて書く場合はasync/await の方が読みやすく保守しやすい。
2.then() と await を混在させない。(混在させると複雑になりやすいとのこと)
次は、まとめてawaitです。asyncの関数が終わる時にはすべての処理が終わっていてほしい(すべての処理結果を踏まえて次の処理が動く)のですが、それぞれawaitとやると時間がかかるので、並行して処理してほしい。なんていうときはFuture.waitです。
FuturefetchUserData(int sec) async { return await Future.delayed( Duration(seconds: sec), () => print('User Data($sec)')); } Future doubleCallFetch() async { await Future.wait([ fetchUserData(4), fetchUserData(2), ]); } void main() async { await doubleCallFetch(); await fetchUserData(1); } =処理結果= User Data(2) User Data(4) User Data(1)