Sobes.tech
Middle

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:

    • async atzīmē funkciju, kas veiks asinhronas operācijas un atgriezīs Future.
    • await tiek izmantots async funkcijas iekšienē, lai gaidītu Future pabeigšanu. Sasniedzot await, funkcijas izpilde tiek apturēta, ļaujot izpildīt citus uzdevumus, kamēr Future nebeidzas 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ē. Future var būt vienā no trim stāvokļiem:

    • Nepabeigts (uncompleted)
    • Ar rezultātu (completed with a value)
    • Ar kļūdu (completed with an error)

    Future pabeigšanas apstrāde tiek veikta ar then(), catchError(), whenComplete() vai await.

  • 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 ar listen(), 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.