Jaka jest różnica między async i async * w Dart?

92

Tworzę aplikację przy użyciu frameworka flutter. Podczas tego natknąłem się na słowa kluczowe w Dart asynci async*. Czy ktoś może mi powiedzieć, jaka jest różnica między nimi?

Jagraj Singh
źródło

Odpowiedzi:

122

Oznaczanie funkcji jako asynclub async*umożliwia jej użycie słowa kluczowego async/ w awaitcelu użycia Future.

Różnica między nimi polega na tym, async*że zawsze zwraca a Streami oferuje trochę cukru składniowego do emitowania wartości za pomocą yieldsłowa kluczowego.

Możemy zatem wykonać następujące czynności:

Stream<int> foo() async* {
  for (int i = 0; i < 42; i++) {
    await Future.delayed(const Duration(seconds: 1));
    yield i;
  }
}

Ta funkcja emituje wartość co sekundę, która zwiększa się za każdym razem

Rémi Rousselet
źródło
3
Powinieneś dodać, skąd masz przykład, miło jest przeczytać, Dart Documentationjak również odniesienie :)
Skizo-ozᴉʞS
3
@ Skizo-ozᴉʞS link nie działa. Najlepszy dokument, jaki udało mi się znaleźć, to: dart.dev/tutorials/language/streams .
wdev
1
Oznaczając funkcję jako async *, jesteśmy w stanie użyć słowa kluczowego yield i zwrócić strumień danych.
Yash
83

Krótka odpowiedź

  • async daje Future
  • async*daje Stream.

async

Dodajesz asyncsłowo kluczowe do funkcji, która wykonuje pewną pracę, która może zająć dużo czasu. Zwraca wynik opakowany w Future.

Future<int> doSomeLongTask() async {
  await Future.delayed(const Duration(seconds: 1));
  return 42;
}

Możesz uzyskać ten wynik, czekając na przyszłość:

main() async {
  int result = await doSomeLongTask();
  print(result); // prints '42' after waiting 1 second
}

async *

Dodajesz async*słowo kluczowe, aby utworzyć funkcję, która zwraca po kolei kilka przyszłych wartości. Wyniki są opakowane w strumień.

Stream<int> countForOneMinute() async* {
  for (int i = 1; i <= 60; i++) {
    await Future.delayed(const Duration(seconds: 1));
    yield i;
  }
}

Terminem technicznym określającym to jest asynchroniczna funkcja generatora . Używasz yielddo zwracania wartości zamiast, returnponieważ nie opuszczasz funkcji.

Możesz await forczekać na każdą wartość wyemitowaną przez Stream.

main() async {
  await for (int i in countForOneMinute()) {
    print(i); // prints 1 to 60, one integer per second
  }
}

Dziać się

Obejrzyj te filmy, aby dowiedzieć się więcej, zwłaszcza ten dotyczący Generatorów:

Suragch
źródło
2
„Obejrzyj te filmy” - byłoby wspaniale, gdybyś mógł również podać odniesienia tekstowe . Nie każdy lubi filmy ...
Aconcagua
Tak doskonałe wyjaśnienie. Jestem pod wrażeniem
roun paleum