Šta su generatori u Dart-u (sync* i async*) i kako funkcionišu?
sobes.tech АИ
Одговор од АИ
Generatori u Dart-u su funkcije koje vraćaju sekvencu vrednosti dok se generišu, a ne ceo rezultat odjednom. Koriste se ključne reči sync* za sinhrone generatore i async* za asinhrone generatore.
Sinhroni generatori (sync*)
Vraćaju objekat tipa Iterable. Koriste ključnu reč yield za emitovanje sledeće vrednosti. Tok izvršenja se pauzira dok se ne zatraži sledeća vrednost (npr. u for-in petlji).
Iterable<int> countUpTo(int max) sync* {
for (int i = 1; i <= max; i++) {
yield i; // Emitovanje vrednosti
}
}
Asinhroni generatori (async*)
Vraćaju objekat tipa Stream. Koriste ključnu reč yield za emitovanje sledeće vrednosti. Takođe koriste yield* za emitovanje svih vrednosti iz drugog Stream. Tok izvršenja se pauzira i nastavlja kada se pojavi novi asinhroni događaj.
Stream<int> countUpToAsync(int max) async* {
for (int i = 1; i <= max; i++) {
await Future.delayed(Duration(milliseconds: 100)); // Simulacija asinhronog rada
yield i; // Emitovanje vrednosti
}
}
Kako funkcionišu:
Prilikom poziva generator funkcije, telo funkcije se odmah ne izvršava. Vraća se objekat (bilo Iterable, bilo Stream). Prava izvršavanja tela počinje tek kada pokušamo prvi put da dobijemo vrednost. Kada dosegne ključnu reč yield, vrednost se "prenosi" napolje, a stanje funkcije se čuva. Izvršavanje tela se pauzira. Kada pokušamo da dobijemo sledeću vrednost, izvršavanje se nastavlja od mesta gde je stalo, do sledećeg yield ili kraja funkcije.
Razlike:
| Karakteristika | sync* (Sinhrono) | async* (Asinhrono) |
|---|---|---|
| Vraćeni tip | Iterable |
Stream |
| Ključne reči | sync*, yield |
async*, yield, yield* |
Korišćenje await |
Nije dozvoljeno | Dozvoljeno |
| Pauza | Do zahteva za sledeću vrednost | Do pojave sledećeg asinhronog događaja |