Sobes.tech
Middle

Aké sú vaše znalosti o asynchrónnosti v Dart?

sobes.tech AI

Odpoveď od AI

Asynchrónnosť v Dart je realizovaná pomocou:

  • Konceptu "izolátov" (Isolates): Nezávislé pracovné procesy, každý so svojou pamäťou. Používajú sa na paralelné vykonávanie náročných úloh bez blokovania hlavného vlákna používateľského rozhrania. Komunikácia medzi izolátmi prebieha cez porty (ReceivePort, SendPort).

  • Kľúčových slov async, await:

    • async označuje funkciu, ktorá bude vykonávať asynchrónne operácie a vracať Future.
    • await sa používa vo vnútri async funkcie na čakanie na dokončenie Future. Pri dosiahnutí await sa vykonávanie funkcie pozastaví, čo umožní vykonávať iné operácie, kým Future neskončí s hodnotou alebo chybou.
    Future<String> fetchData() async {
      // Simulácia oneskorenia
      await Future.delayed(Duration(seconds: 2));
      return 'Dáta získané';
    }
    
    void main() async {
      print('Začiatok');
      String result = await fetchData(); // Čakáme na dokončenie fetchData
      print(result);
      print('Koniec');
    }
    
  • Triedy Future<T>: Predstavuje výsledok asynchrónnej operácie, ktorý bude dostupný v budúcnosti. Future môže byť v jednom zo troch stavov:

    • Neukončený (uncompleted)
    • Ukončený s hodnotou (completed with a value)
    • Ukončený s chybou (completed with an error)

    Spracovanie ukončenia Future sa vykonáva pomocou then(), catchError(), whenComplete() alebo await.

  • Triedy Stream<T>: Predstavuje sekvenciu asynchrónnych udalostí. Používa sa na spracovanie tokov dát, napríklad čítanie zo súboru, získavanie dát cez sieť, udalosti používateľského rozhrania. Tok môže byť jednorazový (single-subscription) alebo viacnásobný (broadcast). Spracovanie udalostí toku sa vykonáva pomocou listen(), async*, yield.

    Stream<int> countStream(int to) async* {
      for (int i = 1; i <= to; i++) {
        await Future.delayed(Duration(seconds: 1));
        yield i; // Odoslanie hodnoty do toku
      }
    }
    
    void main() {
      Stream<int> stream = countStream(3);
      stream.listen(
        (data) => print('Prijaté: $data'),
        onError: (error) => print('Chyba: $error'),
        onDone: () => print('Tok ukončený'),
      );
    }
    

Asynchrónnosť v Dart je založená na modeli "jednotného udalostného slučky" (event loop). Hlavný tok vykonáva kód sekvenčne, ale pri stretnutí s asynchrónnou operáciou (napríklad, await alebo Future.then) ju odovzdáva do "fronty udalostí" (event queue) a pokračuje vo vykonávaní ďalšieho kódu. Keď asynchrónna operácia skončí, jej výsledok sa vracia späť do "fronty udalostí". Cyklus udalostí neustále kontroluje "frontu udalostí" a vykonáva úlohy, keď je hlavný tok voľný.