これはDart Advent Calendar 2017の15日目の投稿です。
カレンダーがガラガラで寂しかったので、メモ書きですが、参加しました。
今コツコツとDartでちょっとしたゲームアプリを作ろうとしているのですが、1秒ごとに処理を行いたいと考えていました。もちろんDartなので非同期で。
1秒ごとに処理がされない
最初はこれでいけるんじゃないか?と思って書いてみました。
main() {
List<Foo> foos = []
for(int i = 0; i < 20; i++) {
Foo foo = new Foo();
// なんやかんやで…
foos.add(foo);
}
foos.forEach((foo) async {
await new Future.delayed(new Duration(seconds: 1));
foo.bar();
});
}
こうすると、1秒ごとに20秒まで処理が行われ…ずに、1秒後に20個分の処理結果がドンと表示されました。 よくよく見ると、たしかにそうなるわなぁ…と思います。
これで1秒ごとに処理できる!
for inを使えばできるが…
for inを使えば、処理はできましたが、forはなんかダサイ…。しかもその処理の関数にasyncつけないといけなくなるのでいただけない。
main() async { // 上の関数にasyncつけないといけない // foosを作る処理は省略 for(foo in foos) { await new Future.delayed(new Duration(seconds: 1)); foo.bar(); } }
Future.forEachを使おう
これが一番綺麗でわかりやすいです。イテレータが渡される関数にasyncをつけるだけでよいので見た目もいいですね。
main() { // 上の関数にasync必要なし!
// foosを作る処理は省略
Future.forEach(foos, (foo) async { // こちらにasyncをつける。
await new Future.delayed(new Duration(seconds: 1));
foo.bar();
});
}