Sobes.tech
Middle

Š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