Dartのasyncとasync *の違いは何ですか?


84

フラッターフレームワークを使用してアプリケーションを作成しています。この間、Dartasyncとのキーワードに出くわしましたasync*。誰かがそれらの違いは何ですか?

回答:


112

関数をとしてマークするasyncasync*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;
  }
}

この関数は毎秒値を出し、その値は毎回インクリメントします


2
例を入手した場所を追加する必要があります。Dart Documentation参考資料と同様に読むのも良いでしょう:)
Skizo-ozᴉʞS19年

3
@Skizo-ozᴉʞSリンクが切れています。私が見つけた最高のドキュメントは、dart.dev / tutorials / language / streamsです。
WDEV

1
関数をasync *としてマークすることにより、yieldキーワードを使用して、データのストリームを返すことができます。
ヤシュ

71

短い答え

  • 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
  }
}

続けます

詳細については、これらのビデオ、特にジェネレーターに関するビデオをご覧ください。


2
「これらのビデオを見る」–テキストによる参照も提供できれば素晴らしいと思います。誰もが...動画が好きです
アコンカグア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.