Kādas ir jūsu zināšanas par asinhronitāti Dart?
sobes.tech AI
Atbilde no AI
Dart valodā asinhronitāte tiek īstenota ar izmantojot:
-
"Izolātu" (Isolates) koncepciju: Neatkarīgi darba procesi, katrs ar savu atmiņu. Tos tiek izmantotas paralēla resursu intensīvu uzdevumu izpildei bez galvenā lietotāja saskarnes plūsmas bloķēšanas. Izolātu starpā komunikācija notiek caur portiem (ReceivePort, SendPort).
-
Vārdu
async,await:asyncatzīmē funkciju, kas veiks asinhronas operācijas un atgriezīsFuture.awaittiek izmantotsasyncfunkcijas iekšienē, lai gaidītuFuturepabeigšanu. Sasniedzotawait, funkcijas izpilde tiek apturēta, ļaujot izpildīt citus uzdevumus, kamērFuturenebeidzas ar rezultātu vai kļūdu.
Future<String> fetchData() async { // Ilūzija par aizkavi await Future.delayed(Duration(seconds: 2)); return 'Dati saņemti'; } void main() async { print('Sākums'); String result = await fetchData(); // Gaidām fetchData pabeigšanu print(result); print('Beigas'); } -
Future<T>klases: Pārstāv asinhronas operācijas rezultātu, kas būs pieejams nākotnē.Futurevar būt vienā no trim stāvokļiem:- Nepabeigts (uncompleted)
- Ar rezultātu (completed with a value)
- Ar kļūdu (completed with an error)
Futurepabeigšanas apstrāde tiek veikta arthen(),catchError(),whenComplete()vaiawait. -
Stream<T>klases: Pārstāv asinhronu notikumu secību. To izmanto datu plūsmu apstrādei, piemēram, faila lasīšanai, datu saņemšanai tīklā, lietotāja saskarnes notikumiem. Plūsma var būt vienreizēja (single-subscription) vai daudzreizēja (broadcast). Notikumu apstrāde notiek arlisten(),async*,yield.Stream<int> countStream(int to) async* { for (int i = 1; i <= to; i++) { await Future.delayed(Duration(seconds: 1)); yield i; // Nosūtīt vērtību uz plūsmu } } void main() { Stream<int> stream = countStream(3); stream.listen( (data) => print('Saņemts: $data'), onError: (error) => print('Kļūda: $error'), onDone: () => print('Plūsma pabeigta'), ); }
Asinhronitāte Dart valodā balstās uz "notikumu cilpa" (event loop) modeli. Galvenais plūsma izpilda kodu secīgi, bet, sastopoties ar asinhronu operāciju (piemēram, await vai Future.then), tā to pārsūta uz "notikumu rindu" (event queue) un turpina ar nākamo kodu. Kad asinhrona operācija pabeidzas, tās rezultāts tiek atgriezts atpakaļ uz "notikumu rindu". Notikumu cilpa pastāvīgi pārbauda "notikumu rindu" un izpilda uzdevumus, kad galvenais plūsma ir brīva.