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 |