Sobes.tech
Middle

Care este cunoștințele tale despre asincronie în Dart?

sobes.tech AI

Răspuns de la AI

Asincronitatea în Dart este implementată folosind:

  • Conceptul de "izolate" (Isolates): Procese de lucru independente, fiecare cu propria memorie. Sunt utilizate pentru executarea paralelă a sarcinilor intensive în resurse fără a bloca firul principal al interfeței utilizatorului. Comunicare între izolate se face prin porturi (ReceivePort, SendPort).

  • Cuvinte cheie async, await:

    • async marchează o funcție care va efectua operații asincrone și va returna un Future.
    • await este utilizat în interiorul unei funcții async pentru a aștepta finalizarea unui Future. Când este atins, execuția funcției este suspendată, permițând altor operații să fie executate în timp ce Future se finalizează cu o valoare sau o eroare.
    Future<String> fetchData() async {
      // Simulare întârziere
      await Future.delayed(Duration(seconds: 2));
      return 'Date primite';
    }
    
    void main() async {
      print('Început');
      String result = await fetchData(); // Așteptăm finalizarea fetchData
      print(result);
      print('Sfârșit');
    }
    
  • Clasa Future<T>: Reprezintă rezultatul unei operații asincrone care va fi disponibil în viitor. Future poate fi în una dintre cele trei stări:

    • Necompletat (uncompleted)
    • Completat cu o valoare (completed with a value)
    • Completat cu o eroare (completed with an error)

    Gestionarea finalizării Future se face cu then(), catchError(), whenComplete() sau await.

  • Clasa Stream<T>: Reprezintă o secvență de evenimente asincrone. Este utilizată pentru procesarea fluxurilor de date, de exemplu, citirea din fișier, primirea datelor prin rețea, evenimente ale interfeței utilizatorului. Fluxul poate fi de abonare unică (single-subscription) sau multiplă (broadcast). Gestionarea evenimentelor fluxului se face cu listen(), async*, yield.

    Stream<int> countStream(int to) async* {
      for (int i = 1; i <= to; i++) {
        await Future.delayed(Duration(seconds: 1));
        yield i; // Trimiterea valorii în flux
      }
    }
    
    void main() {
      Stream<int> stream = countStream(3);
      stream.listen(
        (data) => print('Primite: $data'),
        onError: (error) => print('Eroare: $error'),
        onDone: () => print('Fluxul s-a terminat'),
      );
    }
    

Asincronismul în Dart se bazează pe modelul "buclă de evenimente" (event loop). Thread-ul principal execută codul secvențial, dar la întâlnirea unei operații asincrone (de exemplu, await sau Future.then), aceasta este delegată la "coada de evenimente" (event queue) și continuă executarea codului următor. Când operația asincronă se finalizează, rezultatul său este trimis înapoi la "coada de evenimente". Bucla de evenimente verifică continuu "coada de evenimente" și execută sarcinile atunci când thread-ul principal este liber.