フラッターフレームワークを使用してアプリケーションを作成しています。この間、Dartasync
とのキーワードに出くわしましたasync*
。誰かがそれらの違いは何ですか?
回答:
関数をとしてマークするasync
かasync*
、async
/await
キーワードを使用してを使用できるようにしますFuture
。
両方の違いは、async*
常にaStream
を返し、yield
キーワードを介して値を出力するための構文糖衣構文を提供することです。
したがって、次のことができます。
Stream<int> foo() async* {
for (int i = 0; i < 42; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
この関数は毎秒値を出し、その値は毎回インクリメントします
async
あなたに Future
async*
あなたにStream
。async
時間がかかる可能性のある作業を行う関数にキーワードを追加します。でラップされた結果を返しますFuture
。
Future<int> doSomeLongTask() async {
await Future.delayed(const Duration(seconds: 1));
return 42;
}
あなたは未来を待つことによってその結果を得ることができます:
main() async {
int result = await doSomeLongTask();
print(result); // prints '42' after waiting 1 second
}
async*
キーワードを追加して、将来の値の束を一度に1つずつ返す関数を作成します。結果はストリームにラップされます。
Stream<int> countForOneMinute() async* {
for (int i = 1; i <= 60; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
これの専門用語は非同期ジェネレーター関数です。関数を離れないためではなくyield
、値を返すために使用しreturn
ます。
await for
ストリームから発行される各値を待機するために使用できます。
main() async {
await for (int i in countForOneMinute()) {
print(i); // prints 1 to 60, one integer per second
}
}
詳細については、これらのビデオ、特にジェネレーターに関するビデオをご覧ください。
Dart Documentation
参考資料と同様に読むのも良いでしょう:)