【Flutter/Dart】async/awaitの使い方|非同期処理 part2

async/await
目次

async/awaitとは?

async/awaitを使えば、非同期処理におけるthenメソッドと同じ処理をより簡単に実行できます。よって、非同期処理で生成した戻り値(future)を使用する際、thenメソッドの代わりにasync/awaitを使うのがおすすめです。

「非同期処理 Part1」の記事はこちら!

async/awaitの役割

asyncを使うことで、関数を非同期関数として定義できます。

awaitとは、asyncによって定義された非同期関数で使用できるthenメソッドのようなもの。

非同期関数の定義(async)

//void型
void 非同期関数名() async{
  (実行する処理) //非同期処理を実行できる
};

//戻り値のある場合
Future<型> 非同期関数名() async{
  (実行する処理) //非同期処理を実行できる
  return 戻り値;
};

上のコードのように、関数の波括弧{ }の前にasyncをつけるだけで非同期関数を定義できます。

asyncで非同期関数を定義する目的は、thenメソッドの代わりとなる「await」を使用するためです。

「thenメソッド」と「await」の違い

awaitとthenメソッドでできることは同じですが、thenメソッドよりもawaitの方が簡単に実装できます。それでは、実際にawaitを使うべきメリットをthenメソッドと比べながら解説していきます。

「thenメソッド」はチェーンのように扱う

//定義
future(戻り値)を持つ非同期処理.then(コールバック関数);
//例
void main() {
  task1().then((value1) {
    task2(value1).then((value2) {
      task3(value2);
    });
  });
}

Future<String> task1() {
  return Future.delayed(Duration(seconds: 3), () {
    print('task1で処理中...');
    return 'Hello World';
  });
}

Future<String> task2(String value) {
  return Future.delayed(Duration(seconds: 3), () {
    print('task2で処理中...');
    return value;
  });
}

void task3(String value) {
  print('task3で処理中...');
  print(value);
}

//出力
//task1で処理中...
//task2で処理中...
//task3で処理中...
//Hello World

このコードを見れば分かりますが、thenメソッドはコールバック関数を用いて、あたかもチェーン(鎖)のようにfutureとなる値を扱います。よって、thenメソッドではパッと見てコードを把握しにくいです。

「await」はシンプル

//定義
//void型
void 非同期関数名() async{

  await 非同期処理;
  .....
  型 オブジェクト名 = await 戻り値を持つ非同期処理;
  .....
};

//future(戻り値)のある場合
Future<型> 非同期関数名() async{
  await 非同期処理;
  .....
  型 オブジェクト名 = await 非同期処理;
  .....
  return 戻り値;
};
//例
void main() async {
  String value1 = await task1();
  String value2 = await task2(value1);
  task3(value2);
}

Future<String> task1() {
  return Future.delayed(Duration(seconds: 3), () {
    print('task1で処理中...');
    return 'Hello World';
  });
}

Future<String> task2(String value) {
  return Future.delayed(Duration(seconds: 3), () {
    print('task2で処理中...');
    return value;
  });
}

void task3(String value) {
  print('task3で処理中...');
  print(value);
}

//出力
//task1で処理中...
//task2で処理中...
//task3で処理中...
//Hello World

asyncで定義された非同期関数における非同期処理の前にawaitを付けることで、その処理が完了するまで次の処理を実行できないように指定できます。また、futureの値をオブジェクトに代入できるのでコードが把握しやすいです。

参考

よかったらシェアしてね!
目次
閉じる