Sobes.tech
Middle

Wat is jouw kennis over asynchroniciteit in Dart?

sobes.tech AI

Antwoord van AI

Asynchroniciteit in Dart wordt geïmplementeerd met:

  • Concept van "isolaten" (Isolates): Onafhankelijke werkprocessen, elk met zijn eigen geheugen. Gebruikt voor het parallel uitvoeren van resource-intensieve taken zonder de hoofdthread van de gebruikersinterface te blokkeren. Communicatie tussen isolaten gebeurt via poorten (ReceivePort, SendPort).

  • Trefwoorden async, await:

    • async markeert een functie die asynchrone operaties zal uitvoeren en een Future zal retourneren.
    • await wordt binnen een async functie gebruikt om te wachten op de voltooiing van een Future. Wanneer await wordt bereikt, wordt de uitvoering van de functie gepauzeerd, zodat andere operaties kunnen worden uitgevoerd terwijl de Future wordt voltooid met een waarde of fout.
    Future<String> fetchData() async {
      // Simulatie van vertraging
      await Future.delayed(Duration(seconds: 2));
      return 'Gegevens ontvangen';
    }
    
    void main() async {
      print('Begin');
      String result = await fetchData(); // Wachten op fetchData
      print(result);
      print('Einde');
    }
    
  • Klasse Future<T>: Vertegenwoordigt het resultaat van een asynchrone operatie die in de toekomst beschikbaar zal zijn. Future kan in een van drie toestanden verkeren:

    • Niet voltooid (uncompleted)
    • Voltooid met een waarde (completed with a value)
    • Voltooid met een fout (completed with an error)

    Het afhandelen van de voltooiing van een Future gebeurt met then(), catchError(), whenComplete() of await.

  • Klasse Stream<T>: Vertegenwoordigt een reeks asynchrone gebeurtenissen. Wordt gebruikt voor het verwerken van datastromen, bijvoorbeeld het lezen van een bestand, het ontvangen van gegevens via het netwerk, gebruikersinterfacegebeurtenissen. De stroom kan single-subscription of multi-subscription zijn. Het afhandelen van gebeurtenissen in de stroom gebeurt met listen(), async*, yield.

    Stream<int> countStream(int to) async* {
      for (int i = 1; i <= to; i++) {
        await Future.delayed(Duration(seconds: 1));
        yield i; // Verzenden van waarde naar de stroom
      }
    }
    
    void main() {
      Stream<int> stream = countStream(3);
      stream.listen(
        (data) => print('Ontvangen: $data'),
        onError: (error) => print('Fout: $error'),
        onDone: () => print('Stroom voltooid'),
      );
    }
    

Asynchroniciteit in Dart is gebaseerd op het "evenementenlus" (event loop) model. De hoofdthread voert code sequentieel uit, maar bij het tegenkomen van een asynchrone operatie (bijvoorbeeld await of Future.then) wordt deze gedelegeerd aan de "evenementenwachtrij" (event queue) en gaat de code verder. Wanneer de asynchrone operatie voltooid is, wordt het resultaat teruggestuurd naar de "evenementenwachtrij". De gebeurtenenschleife controleert voortdurend de "evenementenwachtrij" en voert taken uit wanneer de hoofdthread vrij is.