Android
iOS
Dart
Flutter

Dartでの非同期処理(then vs async/await)

docomo Developer supportを運用している@akatsukahaです.

Dartでは非同期処理を実施するのにFutureというものが準備されています.JavaScriptでいうところのPromiseだと理解してもらえれば大丈夫です.JavaScript同様に非同期処理をthenよりasync/awaitを用いたほうが簡潔に記述出来ます.thenを利用する場合,階層が深くなりソースコードの可読性が損なわれるため,個人的にはasync/awaitを利用するのが良いと思います.下記のコードでは,タイムスタンプをコンソールに表示し,10秒後の再度タイムスタンプをコンソールに表示するプログラムです.

DartPadにコピペしてもらえばすぐ実行出来ます.


1. thenの例

import 'dart:async';

void main() async {
print(new DateTime.now());
futureTest()
.then((result) {
print(result);
});
}

Future <String> futureTest(){
return new Future.delayed(new Duration(seconds: 10), (){
return new DateTime.now().toString();
});
}

2018-08-01 22:11:33.674

2018-08-01 22:11:43.678

約10秒後に処理が実行されている.

ここでネストの回数が1回なので見やすいですが,実際のプロジェクトでは複数回ネストされることもあり,それぞれの階層で複数の処理を記載されるので,かなり可読性が下がります.


2. async/awaitの例

import 'dart:async';

void main() async {
print(new DateTime.now());
var result = await futureTest();
print(result);
}

Future <String> futureTest(){
return new Future.delayed(new Duration(seconds: 10), (){
return new DateTime.now().toString();
});
}

2018-08-01 22:03:11.706

2018-08-01 22:03:21.706

約10秒後に処理が実行されている.

こちらのほうでしっくりきます.


3.最後に

公式のサイトだとthenの実行サンプルが多数ありますが,async/awaitを利用したほうが可読性があり良いと思います.