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:asyncoznačuje funkciu, ktorá bude vykonávať asynchrónne operácie a vracaťFuture.awaitsa používa vo vnútriasyncfunkcie na čakanie na dokončenieFuture. Pri dosiahnutíawaitsa vykonávanie funkcie pozastaví, čo umožní vykonávať iné operácie, kýmFutureneskončí 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.Futuremôž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
Futuresa vykonáva pomocouthen(),catchError(),whenComplete()aleboawait. -
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 pomocoulisten(),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ý.