|

Dartの勉強11−2:同期・非同期(.then)(まとめてawait)

まずは、このコードを見てみようか。

=async/awaitを使わない=
Future fetchUserData() {
  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を使うことも可能だということです。

Future fetchUserData() {
  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です。

Future fetchUserData(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)

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.