Sobes.tech
Middle

¿Cuáles son sus conocimientos sobre asincronía en Dart?

sobes.tech AI

Respuesta de la IA

La asincronía en Dart se implementa mediante:

  • Concepto de "aislantes" (Isolates): Procesos de trabajo independientes, cada uno con su propia memoria. Se utilizan para ejecutar tareas intensivas en recursos en paralelo sin bloquear el hilo principal de la interfaz de usuario. La comunicación entre aislantes se realiza a través de puertos (ReceivePort, SendPort).

  • Palabras clave async, await:

    • async marca una función que realizará operaciones asíncronas y devolverá un Future.
    • await se usa dentro de una función async para esperar a que un Future termine. Cuando se alcanza await, la ejecución de la función se suspende, permitiendo que otras operaciones se ejecuten mientras el Future termina con un valor o error.
    Future<String> fetchData() async {
      // Simulación de retardo
      await Future.delayed(Duration(seconds: 2));
      return 'Datos recibidos';
    }
    
    void main() async {
      print('Inicio');
      String result = await fetchData(); // Espera a que fetchData termine
      print(result);
      print('Fin');
    }
    
  • Clase Future<T>: Representa el resultado de una operación asíncrona que estará disponible en el futuro. Future puede estar en uno de tres estados:

    • No completado (uncompleted)
    • Completado con un valor (completed with a value)
    • Completado con un error (completed with an error)

    La gestión de la finalización de un Future se realiza mediante then(), catchError(), whenComplete() o await.

  • Clase Stream<T>: Representa una secuencia de eventos asíncronos. Se usa para manejar flujos de datos, por ejemplo, lectura de archivos, recepción de datos por red, eventos de interfaz de usuario. El flujo puede ser de una sola suscripción (single-subscription) o de múltiples suscripciones (broadcast). La gestión de eventos del flujo se realiza con listen(), async*, yield.

    Stream<int> countStream(int to) async* {
      for (int i = 1; i <= to; i++) {
        await Future.delayed(Duration(seconds: 1));
        yield i; // Envío de valor al flujo
      }
    }
    
    void main() {
      Stream<int> stream = countStream(3);
      stream.listen(
        (data) => print('Recibido: $data'),
        onError: (error) => print('Error: $error'),
        onDone: () => print('El flujo ha terminado'),
      );
    }
    

La asincronía en Dart se basa en el modelo de "bucle de eventos" (event loop). El hilo principal ejecuta el código de forma secuencial, pero al encontrar una operación asíncrona (por ejemplo, await o Future.then), la delega al "pool de eventos" (event queue) y continúa ejecutando el siguiente código. Cuando la operación asíncrona termina, su resultado se envía de vuelta al "pool de eventos". El ciclo de eventos revisa continuamente el "pool de eventos" y ejecuta las tareas cuando el hilo principal está libre.