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?
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:
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
async gibt dir eine Futureasync* gibt dir eine Stream .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
}
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
}
}
Sehen Sie sich diese Videos an, um mehr zu erfahren, insbesondere über Generatoren:
Dart Documentationsowie eine Referenz zu lesen :)