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 |