Sobes.tech
Middle

Mis on generaatorid Dartis (sync* ja async*) ja kuidas nad töötavad?

sobes.tech AI

Vastus AI-lt

Dart'i generaatorid on funktsioonid, mis tagastavad väärtuste jada nende genereerimise ajal, mitte kogu tulemust korraga. Kasutatakse võtmesõnu sync* sünkrooniliste ja async* asünkrooniliste generaatorite jaoks.

Sünkroonilised generaatorid (sync*)

Need tagastavad objekti tüüpi Iterable. Kasutatakse võtmesõna yield, et anda järgmine väärtus. Vool täitmisest on peatatud kuni järgmise väärtuse nõudmiseni (näiteks for-in tsüklis).

Iterable<int> countUpTo(int max) sync* {
  for (int i = 1; i <= max; i++) {
    yield i; // Väärtuse andmine
  }
}

Asünkroonilised generaatorid (async*)

Need tagastavad objekti tüüpi Stream. Kasutatakse võtmesõna yield, et anda järgmine väärtus. Samuti kasutatakse yield*, et anda kõik väärtused teiselt Stream-ilt. Täitmisvoog on peatatud ja jätkub uue asünkroonilise sündmuse ilmumisel.

Stream<int> countUpToAsync(int max) async* {
  for (int i = 1; i <= max; i++) {
    await Future.delayed(Duration(milliseconds: 100)); // Asünkroonse töö imitatsioon
    yield i; // Väärtuse andmine
  }
}

Kuidas nad töötavad:

Genereerimisfunktsiooni väljakutsumisel ei täideta keha kohe. Tagastatakse objekt (või Iterable, või Stream). Tegelik täitmine algab alles pärast esimest väärtuse saamist. Kui jõutakse yield-ni, väärtus edastatakse "välja" ning funktsiooni seisund salvestatakse. Täitmine peatub. Kui järgmisel korral püütakse väärtust saada, jätkub täitmine sealt, kus see peatati, kuni järgmise yield või funktsiooni lõppemiseni.

Erinevused:

Omadus sync* (Sünkroonne) async* (Asünkroonne)
Tagastatava tüüp Iterable Stream
Võtmesõnad sync*, yield async*, yield, yield*
await kasutamine Ei ole lubatud Võib olla
Peatamine Enne järgmise väärtuse nõudmist Enne uue asünkroonilise sündmuse ilmumist