Was ist der Unterschied zwischen Async und Async * in Dart?

84

Ich mache eine Anwendung mit Flatter-Framework. Dabei bin ich auf die Schlüsselwörter in Dart asyncund gestoßen async*. Kann mir jemand sagen, was der Unterschied zwischen ihnen ist?

Jagraj Singh
quelle

Antworten:

112

Markieren einer Funktion als asyncoder async*ermöglicht die Verwendung von async/ awaitkeyword zur Verwendung von a Future.

Der Unterschied zwischen beiden besteht darin, dass async*immer a zurückgegeben wird Streamund etwas Syntaxzucker angeboten wird, um einen Wert über das yieldSchlüsselwort auszugeben.

Wir können daher Folgendes tun:

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

Diese Funktion gibt jede Sekunde einen Wert aus, der jedes Mal erhöht wird

Rémi Rousselet
quelle
2
Sie sollten hinzufügen, wo Sie das Beispiel erhalten, ist schön, die Dart Documentationsowie eine Referenz zu lesen :)
Skizo-ozᴉʞS
3
@ Skizo-ozᴉʞS der Link ist tot. Das beste Dokument, das ich darauf finden konnte, ist: dart.dev/tutorials/language/streams .
wdev
1
Durch Markieren einer Funktion als asynchron * können wir das Schlüsselwort yield verwenden und einen Datenstrom zurückgeben.
Yash
71

Kurze Antwort

  • async gibt dir eine Future
  • async* gibt dir eine Stream .

asynchron

Sie fügen das asyncSchlüsselwort einer Funktion hinzu, die einige Arbeiten ausführt, die möglicherweise lange dauern. Es gibt das in a eingeschlossene Ergebnis zurück Future.

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

Sie können dieses Ergebnis erzielen, indem Sie auf die Zukunft warten:

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

asynchron *

Sie fügen das async*Schlüsselwort hinzu, um eine Funktion zu erstellen, die nacheinander eine Reihe zukünftiger Werte zurückgibt. Die Ergebnisse werden in einen Stream eingeschlossen.

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

Der Fachbegriff hierfür lautet asynchrone Generatorfunktion . Sie verwendenyield geben einen Wert zurück, anstatt returndie Funktion nicht zu verlassen.

Sie können verwenden await for, um auf jeden vom Stream ausgegebenen Wert zu warten.

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

Weiter geht's

Sehen Sie sich diese Videos an, um mehr zu erfahren, insbesondere über Generatoren:

Suragch
quelle
2
‚Sehen Sie sich diese Videos‘ - wäre toll , wenn Sie bieten könnte textliche Referenzen als auch. Nicht jeder mag Videos ...
Aconcagua