Tworzę aplikację przy użyciu frameworka flutter. Podczas tego natknąłem się na słowa kluczowe w Dart async
i 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 async
i async*
. Czy ktoś może mi powiedzieć, jaka jest różnica między nimi?
Odpowiedzi:
Oznaczanie funkcji jako async
lub async*
umożliwia jej użycie słowa kluczowego async
/ w await
celu użycia Future
.
Różnica między nimi polega na tym, async*
że zawsze zwraca a Stream
i oferuje trochę cukru składniowego do emitowania wartości za pomocą yield
sł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 Future
async*
daje Stream
.Dodajesz async
sł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 yield
do zwracania wartości zamiast, return
ponieważ nie opuszczasz funkcji.
Możesz await for
czekać 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 Documentation
jak również odniesienie :)