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?
92
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
Dart Documentation
jak również odniesienie :)Krótka odpowiedź
async
dajeFuture
async*
dajeStream
.async
Dodajesz
async
słowo kluczowe do funkcji, która wykonuje pewną pracę, która może zająć dużo czasu. Zwraca wynik opakowany wFuture
.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 }
async *
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 } }
Dziać się
Obejrzyj te filmy, aby dowiedzieć się więcej, zwłaszcza ten dotyczący Generatorów:
źródło