
Async* y await
En Dart, la combinación de las palabras clave async*
y await
se utiliza para trabajar con funciones asíncronas que generan secuencias de valores de forma diferida. Esto se conoce como una función generadora asíncrona.
La palabra clave async*
se coloca antes de la declaración de una función para indicar que esa función es una función generadora asíncrona. Esto significa que la función puede producir una secuencia de valores de forma asíncrona, y esos valores se pueden consumir a medida que están disponibles.
La palabra clave await
se utiliza dentro de una función generadora asíncrona para esperar la finalización de una operación asíncrona antes de continuar la generación de valores. El await
pausa la función hasta que el Future
asociado se complete y se obtenga el resultado. Mientras tanto, se puede realizar otras tareas o procesar otros valores.
Aquí tienes un ejemplo que muestra cómo se utiliza async*
y await
en Dart:
Future<int> obtenerNumero(int valor) async {
await Future.delayed(Duration(seconds: 1));
return valor * 2;
}
Stream<int> generarSecuencia(int cantidad) async* {
for (int i = 1; i <= cantidad; i++) {
yield await obtenerNumero(i);
}
}
void main() async {
Stream<int> secuencia = generarSecuencia(5);
await for (int valor in secuencia) {
print(valor);
}
}
En este ejemplo, la función obtenerNumero()
es una función asíncrona que devuelve un Future<int>
. Utiliza Future.delayed()
para simular una operación asíncrona que tarda 1 segundo en completarse.
La función generarSecuencia()
es una función generadora asíncrona. Utiliza async*
para indicar que es una función generadora asíncrona. Dentro del bucle for
, se utiliza yield await obtenerNumero(i)
para producir de forma asíncrona los valores generados por la función obtenerNumero()
.
En la función main()
, se llama a generarSecuencia()
para obtener un Stream<int>
que representa la secuencia de valores generados. Luego, se utiliza el await for
para recorrer y consumir los valores de la secuencia. A medida que los valores se generan de forma asíncrona, se imprimen en la consola.
Al ejecutar el programa, verás que se imprime la secuencia de números generados: 2, 4, 6, 8, 10.
La combinación de async*
y await
permite generar secuencias de valores de forma asíncrona y consumirlos a medida que están disponibles. Es útil cuando se trabaja con operaciones asíncronas que producen una secuencia de resultados diferidos.
Ejercicio de la Sesión:
void main(){
emitNumber()
.listen( (int value) {
print( 'Stream value: $value');
});
}
Stream<int> emitNumber() async*{
final valuesToEmit = [1,2,3,4,5];
for( int i in valuesToEmit){
await Future.delayed( const Duration(seconds: 1));
yield i;
}
}