Diferencia entre revisiones de «Flutter DART Programación asíncrona»
Ir a la navegación
Ir a la búsqueda
| Línea 22: | Línea 22: | ||
| + | <br /> | ||
:<syntaxhighlight lang="java" enclose="div" highlight="5,13" > | :<syntaxhighlight lang="java" enclose="div" highlight="5,13" > | ||
void main() { | void main() { | ||
| Línea 51: | Línea 52: | ||
<br /> | <br /> | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
===Gestión de errores=== | ===Gestión de errores=== | ||
| Línea 92: | Línea 87: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| + | |||
| + | |||
| + | |||
| + | <br /> | ||
| + | ===Estado Completo=== | ||
| + | * Un Future puede tener dos estados: | ||
| + | :* Incompleto: Cuando se está ejecutando. | ||
| + | :* Completo: Cuando ha terminado de ejecutarse. Este estado lo va a alcanzar haya o no error durante la ejecución del Future. | ||
| + | |||
| + | |||
| + | * Es decir, el método [https://api.dart.dev/stable/2.2.0/dart-async/Future/then.html then] se va a ejecutar sólo cuando el Future acabe de ejecutarse correctamente mientras que el [https://api.dart.dev/stable/2.2.0/dart-async/Future/whenComplete.html método whenComplete] se ejecuta tanto si ha ido bien como si ha habido un error. | ||
| + | |||
| + | : Veamos un ejemplo: | ||
| + | :<syntaxhighlight lang="java" enclose="div" highlight="5,6,8-11" > | ||
| + | void main() { | ||
| + | |||
| + | print('Inicia programa'); | ||
| + | |||
| + | cargarImagenes().then((datos) => print('Acabó el Future1 sin errores')). | ||
| + | whenComplete(() => print('Terminó Future1')); | ||
| + | |||
| + | cargarImagenesConError(). | ||
| + | then((datos) => print('Acabó el Future2 sin errores')). | ||
| + | catchError((e) { print('Capturando el error:$e'); }). | ||
| + | whenComplete(() => print('Terminó Future2')); | ||
| + | |||
| + | print('Fin programa'); | ||
| + | |||
| + | } | ||
| + | Future<void> cargarImagenesConError(){ | ||
| + | |||
| + | return Future.delayed(Duration(seconds: 2),() => throw('Error cargando imágenes')); | ||
| + | |||
| + | } | ||
| + | |||
| + | Future<void> cargarImagenes(){ | ||
| + | |||
| + | return Future.delayed(Duration(seconds: 2),() { print('Cargamos imágenes');}); | ||
| + | |||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | :* El Future cargarImagenes no devuelva nada (void) y se ejecuta sin errores, por lo tanto, la llamada a la función desde el hilo principal ejecuta el método then y el método whenComplete. | ||
| + | :* El Future cargarImagenesConError no devuelva nada (void) y <u>se ejecuta con errores</u>, por lo tanto, la llamada a la función desde el hilo principal ejecuta el método catchError y el método whenComplete. | ||
| + | |||
Revisión del 14:35 12 jul 2021
Introducción
- Más información: https://dart.dev/codelabs/async-await
- La programación asíncrona hace referencia al uso de threads para ejecutar en modo 'paralelo' al hilo principal otra serie de tareas.
Futures
- Más información:
void main() { print('Inicia programa'); getImagenes('imagenes/animales').then( (datos) => print(datos) ); print('Fin programa'); } Future<List<String>> getImagenes(String path){ List<String> datos = ['1.jpg','2.jpg','3.jpg','4.jpg']; return Future.delayed(Duration(seconds: 4),() => datos); // Paramos el hilo durante 4 segundos // return Future.value(datos); }
Gestión de errores
void main() { print('Inicia programa'); try { getImages('imagenes/animales').then((datos) { datos.forEach((elem) => print('Dato:$elem')); }).catchError((e) { print(e);} ); } catch(e){ print('Excep:$e'); } print('Fin programa'); } Future<List<String>> getImages(String path){ List<String> imagenes = ['1.jpg','2.jpg','3.jpg']; // Búsqueda de imágenes a partir del path //throw('Exepción no controlada'); return Future.delayed(Duration(seconds: 3),() => Future.error('Error controlado')); }
Estado Completo
- Un Future puede tener dos estados:
- Incompleto: Cuando se está ejecutando.
- Completo: Cuando ha terminado de ejecutarse. Este estado lo va a alcanzar haya o no error durante la ejecución del Future.
- Es decir, el método then se va a ejecutar sólo cuando el Future acabe de ejecutarse correctamente mientras que el método whenComplete se ejecuta tanto si ha ido bien como si ha habido un error.
- Veamos un ejemplo:
void main() { print('Inicia programa'); cargarImagenes().then((datos) => print('Acabó el Future1 sin errores')). whenComplete(() => print('Terminó Future1')); cargarImagenesConError(). then((datos) => print('Acabó el Future2 sin errores')). catchError((e) { print('Capturando el error:$e'); }). whenComplete(() => print('Terminó Future2')); print('Fin programa'); } Future<void> cargarImagenesConError(){ return Future.delayed(Duration(seconds: 2),() => throw('Error cargando imágenes')); } Future<void> cargarImagenes(){ return Future.delayed(Duration(seconds: 2),() { print('Cargamos imágenes');}); }
- El Future cargarImagenes no devuelva nada (void) y se ejecuta sin errores, por lo tanto, la llamada a la función desde el hilo principal ejecuta el método then y el método whenComplete.
- El Future cargarImagenesConError no devuelva nada (void) y se ejecuta con errores, por lo tanto, la llamada a la función desde el hilo principal ejecuta el método catchError y el método whenComplete.
Enlace a la página principal de la UD2
Enlace a la página principal del curso
-- Ángel D. Fernández González -- (2021).