La programación asíncrona es una técnica que permite que un programa continúe ejecutándose mientras espera que se completen operaciones de larga duración, como la lectura de archivos, la consulta de bases de datos o las solicitudes de red. En Dart, la programación asíncrona se maneja principalmente mediante Future y async/await.

Conceptos Clave

Future

Un Future representa un valor o error que estará disponible en algún momento en el futuro. Es una promesa de que se proporcionará un valor o se lanzará un error.

async y await

Las palabras clave async y await se utilizan para trabajar con Future de una manera más legible y manejable. async se usa para marcar una función como asíncrona, y await se usa para esperar la finalización de un Future.

Ejemplo Práctico

Ejemplo 1: Uso de Future

void main() {
  print('Inicio del programa');
  
  Future.delayed(Duration(seconds: 2), () {
    print('Operación asíncrona completada');
  });
  
  print('Fin del programa');
}

Explicación:

  1. print('Inicio del programa'); se ejecuta inmediatamente.
  2. Future.delayed(Duration(seconds: 2), () { ... }); programa una operación que se ejecutará después de 2 segundos.
  3. print('Fin del programa'); se ejecuta inmediatamente después de programar la operación asíncrona.
  4. Después de 2 segundos, se ejecuta la operación asíncrona y se imprime Operación asíncrona completada.

Ejemplo 2: Uso de async y await

void main() async {
  print('Inicio del programa');
  
  await Future.delayed(Duration(seconds: 2), () {
    print('Operación asíncrona completada');
  });
  
  print('Fin del programa');
}

Explicación:

  1. print('Inicio del programa'); se ejecuta inmediatamente.
  2. await Future.delayed(Duration(seconds: 2), () { ... }); espera a que se complete la operación asíncrona antes de continuar.
  3. Después de 2 segundos, se ejecuta la operación asíncrona y se imprime Operación asíncrona completada.
  4. print('Fin del programa'); se ejecuta después de que la operación asíncrona se haya completado.

Ejercicios Prácticos

Ejercicio 1: Simulación de una Solicitud de Red

Instrucciones:

  1. Simula una solicitud de red que tarda 3 segundos en completarse.
  2. Imprime un mensaje antes y después de la solicitud.

Código Inicial:

void main() async {
  // Imprime "Inicio de la solicitud"
  
  // Simula una solicitud de red con Future.delayed
  
  // Imprime "Solicitud completada"
}

Solución:

void main() async {
  print('Inicio de la solicitud');
  
  await Future.delayed(Duration(seconds: 3), () {
    print('Solicitud completada');
  });
  
  print('Fin del programa');
}

Ejercicio 2: Manejo de Errores en Operaciones Asíncronas

Instrucciones:

  1. Simula una operación asíncrona que lanza un error después de 2 segundos.
  2. Maneja el error usando try-catch.

Código Inicial:

void main() async {
  // Simula una operación asíncrona que lanza un error
  
  // Maneja el error usando try-catch
}

Solución:

void main() async {
  try {
    await Future.delayed(Duration(seconds: 2), () {
      throw Exception('Ocurrió un error');
    });
  } catch (e) {
    print('Error: $e');
  }
  
  print('Fin del programa');
}

Resumen

En esta sección, hemos aprendido los conceptos básicos de la programación asíncrona en Dart, incluyendo el uso de Future, async y await. También hemos visto ejemplos prácticos y realizado ejercicios para reforzar estos conceptos. La programación asíncrona es esencial para manejar operaciones de larga duración sin bloquear la ejecución del programa, y es una habilidad crucial para cualquier desarrollador de Dart.

En el próximo tema, exploraremos los Streams, que son una forma de manejar flujos de datos asíncronos en Dart.

© Copyright 2024. Todos los derechos reservados