📡

Dartで非同期処理をやってみる①

2022/04/26に公開

非同期処理とは何か?

APIの情報取得が完了するまで指定した処理を待つよう指定させたり、待ち時間がある処理をスキップして同時に複数の処理を実行させたりできます。

同期処理の方はどういうことかというと

  • 書いた順番に実行されていく
  • 重たい処理が間にあると、そこで大きな待ち時間が生まれる

今回は、Dartで学んだ非同期処理について書いていこうと思います。

以前書いていたサンプル

sample.dart

import 'dart:async';

class Person {
  int? futureNum;
  String? futureName;
  // 数値を入れる
  static Future<void> future1(futureNum) async {
    await futureNum;
    print(futureNum);
  }
  // 文字を入れる
  static Future<String> future2(futureName) async {
    // 3秒後に処理が実行されるようにするメソッド
    await Future.delayed(Duration(seconds: 3));
    return futureName;
  }
}

Future main() async {
  await Person.future1(33);
  final getName = await Person.future2("Jboy");
  print("3秒後に非同期処理が走る: $getNameさんいたよ!");
}

実行結果

33
3秒後に非同期処理が走る: Jboyさんいたよ!
Exited

async awaitで書くのがよく見かけるコーディングですね。しかし、最近thenメソッドで書くのを勉強して、いくつかコードを書いてみたので、やってみようと思います。

現在時刻を非同期で取得する

future.dart

void main() {
print('Start ' + DateTime.now().toString());
print('1秒後に処理を実行');
// ここにdelayed処理
Future.delayed(Duration(milliseconds: 1000))
.then((_) =>print('End ' + DateTime.now().toString()));
}

実行結果

Start 2022-04-26 18:49:01.227315
1秒後に処理を実行
End 2022-04-26 18:49:02.240351

メソッドを使ってみたパターン

timezone.dart

import 'dart:async';
void main() {
  print('Start ' + DateTime.now().toString());
  timezone();
}

Future<void> timezone() async {
  await Future.delayed(Duration(seconds: 1));
  print('1秒後に処理を実行');
  print('End ' + DateTime.now().toString());
}

実行結果

Start 2022-04-26 18:54:47.533432
1秒後に処理を実行
End 2022-04-26 18:54:48.546633
Exited

こちらは、昨夜メンターさんから、教わった書き方を参考に考えてみたコード。メソッドチェーンってやつですかね🤔
timezone.dart

import 'dart:async';

void main() {
  print('Start ' + DateTime.now().toString());
  timezone();
}

Future<void> timezone() async {
  Future.delayed(Duration(seconds: 1))
      .then((_) => print('1秒後にプロミスで処理を実行'))
      .then((_) => print('End ' + DateTime.now().toString()));
}

実行結果

Start 2022-04-26 19:03:08.874082
1秒後にプロミスで処理を実行
End 2022-04-26 19:03:09.888319

公式のドキュメントで、thenメソッドの解説ありました!
https://api.dart.dev/stable/2.10.4/dart-async/Future-class.html

翻訳してみた🤔
Future<T>class Null safety
遅延計算を表すオブジェクト。

Futureは、将来のある時点で利用可能になる潜在的な値またはエラーを表すために使用されます。Futureのレシーバーは、値またはエラーが使用可能になると、それを処理するコールバックを登録できます。

Future<int> future = getFuture();
future.then((value) => handleValue(value))
      .catchError((error) => handleError(error));

.then((_) => print(''))、これはコールバックをやっていたということですね。ふむふむ🤔
JavaScriptのPromiseと同じと解釈すれば良さそう...
他の言語を知っていると理解しやすい。

やってみた感想

この文法を覚えると、どんなことに役に立つかというとFlutterFireのドキュメントに書いてあるコードが読めるようになる。
公式のドキュメントはthenメソッドなので😅
Flutterで非同期処理を書くときは、async awaitばかり使っておりましたが、thenメソッドを理解していないと、人のソースコードを理解できないのに最近気づいた!

Discussion