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?
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?
Odpowiedzi:
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
async daje Futureasync*daje Stream.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
}
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
}
}
Obejrzyj te filmy, aby dowiedzieć się więcej, zwłaszcza ten dotyczący Generatorów:
Dart Documentationjak również odniesienie :)