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?

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


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:


2
‚Sehen Sie sich diese Videos‘ - wäre toll , wenn Sie bieten könnte textliche Referenzen als auch. Nicht jeder mag Videos ...
Aconcagua
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.