Sobes.tech
Middle

Mi a generátor Dartban (sync* és async*) és hogyan működik?

sobes.tech MI

Válasz az MI-től

A Dart-ben a generátorok olyan függvények, amelyek értékek sorozatát adják vissza, ahogy azok generálódnak, nem pedig az összes eredményt egyszerre. A sync* kulcsszót szinkron generátorokhoz, az async*-et pedig aszinkron generátorokhoz használják.

Szinkron generátorok (sync*)

Iterable típusú objektumot adnak vissza. A yield kulcsszót használják a következő érték kiadására. A végrehajtási folyamat szünetel, amíg a következő érték nem kérik (például egy for-in ciklusban).

Iterable<int> countUpTo(int max) sync* {
  for (int i = 1; i <= max; i++) {
    yield i; // Érték kiadása
  }
}

Aszinkron generátorok (async*)

Stream típusú objektumot adnak vissza. A yield kulcsszót használják a következő érték kiadására. Szintén használják a yield*-et más Stream összes értékének kiadására. A végrehajtás szünetel, és akkor folytatódik, amikor új aszinkron esemény történik.

Stream<int> countUpToAsync(int max) async* {
  for (int i = 1; i <= max; i++) {
    await Future.delayed(Duration(milliseconds: 100)); // Aszinkron munka szimulálása
    yield i; // Érték kiadása
  }
}

Hogyan működnek:

A generátor függvény hívásakor a függvény törzse nem fut le azonnal. Egy objektumot adnak vissza (akár Iterable, akár Stream). A tényleges végrehajtás csak akkor kezdődik, amikor megpróbáljuk először lekérni az értéket. Amikor eléri a yield kulcsszót, az érték "kívül" kerül átadásra, és a függvény állapota elmentésre kerül. A végrehajtás szünetel. A következő érték lekérésekor a végrehajtás ott folytatódik, ahol abbamaradt, a következő yield-ig vagy a függvény végéig.

Különbségek:

Jellemző sync* (Szinkron) async* (Aszinkron)
Visszatérési típus Iterable Stream
Kulcsszavak sync*, yield async*, yield, yield*
await használata Nem megengedett Megengedett
Szünetelés Amíg a következő érték nem kérik Amíg az új aszinkron esemény nem történik