Sobes.tech
Middle

Wat zijn generators in Dart (sync* en async*) en hoe werken ze?

sobes.tech AI

Antwoord van AI

Generators in Dart zijn functies die een reeks waarden teruggeven terwijl ze worden gegenereerd, in plaats van het hele resultaat meteen. Ze gebruiken de sleutelwoorden sync* voor synchronische generators en async* voor asynchrone generators.

Synchronische generators (sync*)

Ze geven een object van het type Iterable terug. Ze gebruiken het sleutelwoord yield om de volgende waarde uit te geven. De uitvoering wordt gepauzeerd totdat de volgende waarde wordt opgevraagd (bijvoorbeeld in een for-in-lus).

Iterable<int> countUpTo(int max) sync* {
  for (int i = 1; i <= max; i++) {
    yield i; // Waarde uitgeven
  }
}

Asynchrone generators (async*)

Ze geven een object van het type Stream terug. Ze gebruiken het sleutelwoord yield om de volgende waarde uit te geven. Ook gebruiken ze yield* om alle waarden van een andere Stream uit te geven. De uitvoering wordt gepauzeerd en hervat wanneer er een nieuw asynchroon evenement plaatsvindt.

Stream<int> countUpToAsync(int max) async* {
  for (int i = 1; i <= max; i++) {
    await Future.delayed(Duration(milliseconds: 100)); // Simulatie van asynchroon werk
    yield i; // Waarde uitgeven
  }
}

Hoe ze werken:

Bij het aanroepen van de generatorfunctie wordt de lichaam van de functie niet onmiddellijk uitgevoerd. Er wordt een object geretourneerd (ofwel Iterable ofwel Stream). De daadwerkelijke uitvoering van het lichaam begint pas wanneer geprobeerd wordt de waarde voor het eerst te krijgen. Wanneer het sleutelwoord yield wordt bereikt, wordt de waarde "naar buiten" overgedragen en wordt de toestand van de functie opgeslagen. De uitvoering van het lichaam wordt gepauzeerd. Bij de volgende poging om een waarde te krijgen, wordt de uitvoering hervat vanaf waar deze was gestopt, tot de volgende yield of het einde van de functie.

Verschillen:

Kenmerk sync* (Synchronous) async* (Asynchronous)
Teruggegeven type Iterable Stream
Sleutelwoorden sync*, yield async*, yield, yield*
Gebruik van await Niet toegestaan Toegestaan
Pauzeren Totdat de volgende waarde wordt aangevraagd Totdat het volgende asynchrone evenement plaatsvindt