Estoy haciendo una aplicación usando el framework flutter. Durante esto me encontré con las palabras clave en Dart async
y async*
. ¿Alguien puede decirme cuál es la diferencia entre ellos?
Estoy haciendo una aplicación usando el framework flutter. Durante esto me encontré con las palabras clave en Dart async
y async*
. ¿Alguien puede decirme cuál es la diferencia entre ellos?
Respuestas:
Marcar una función como async
o le async*
permite usar async
/ await
palabra clave para usar un Future
.
La diferencia entre ambos es que async*
siempre devolverá ay Stream
ofrecerá algo de azúcar sintáctico para emitir un valor a través de la yield
palabra clave.
Por tanto, podemos hacer lo siguiente:
Stream<int> foo() async* {
for (int i = 0; i < 42; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
Esta función emite un valor cada segundo, que se incrementa cada vez
async
te da un Future
async*
te da un Stream
.Agrega la async
palabra clave a una función que realiza un trabajo que puede llevar mucho tiempo. Devuelve el resultado envuelto en un Future
.
Future<int> doSomeLongTask() async {
await Future.delayed(const Duration(seconds: 1));
return 42;
}
Puede obtener ese resultado esperando el futuro:
main() async {
int result = await doSomeLongTask();
print(result); // prints '42' after waiting 1 second
}
Agrega la async*
palabra clave para crear una función que devuelva un montón de valores futuros uno a la vez. Los resultados se envuelven en una secuencia.
Stream<int> countForOneMinute() async* {
for (int i = 1; i <= 60; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
El término técnico para esto es función de generador asíncrono . Usas yield
para devolver un valor en lugar de return
porque no estás abandonando la función.
Puede utilizar await for
para esperar cada valor emitido por la secuencia.
main() async {
await for (int i in countForOneMinute()) {
print(i); // prints 1 to 60, one integer per second
}
}
Mire estos videos para obtener más información, especialmente el de Generadores:
Dart Documentation
y también una referencia :)