Dart tilida generatorlar (sync* va async*) nima va ular qanday ishlaydi?
sobes.tech AI
AIdan javob
Dart'da generatorlar, butun natijani darhol emas, ishlab chiqarilayotgan paytda ketma-ketlikdagi qiymatlarni qaytaradigan funksiyalardir. Ular uchun sync* (sinxron) va async* (asinxron) kalit so'zlar ishlatiladi.
Sinxron generatorlar (sync*)
Iterable turidagi ob'ektni qaytaradi. Keyingi qiymatni chiqarish uchun yield kalit so'zidan foydalanadi. Ishlash oqimi, keyingi qiymat so'ralmaguncha to'xtatiladi (masalan, for-in siklida).
Iterable<int> countUpTo(int max) sync* {
for (int i = 1; i <= max; i++) {
yield i; // Qiymatni chiqarish
}
}
Asinxron generatorlar (async*)
Stream turidagi ob'ektni qaytaradi. Keyingi qiymatni chiqarish uchun yield kalit so'zidan foydalanadi. Shuningdek, boshqa Stream ning barcha qiymatlarini chiqarish uchun yield* ishlatiladi. Ishlash oqimi, yangi asinxron voqea yuzaga kelganda to'xtatiladi va davom ettiriladi.
Stream<int> countUpToAsync(int max) async* {
for (int i = 1; i <= max; i++) {
await Future.delayed(Duration(milliseconds: 100)); // Asinxron ishni taqlid qilish
yield i; // Qiymatni chiqarish
}
}
Ular qanday ishlaydi:
Generator funksiyasini chaqirganda, funksiyaning tanasi darhol bajarilmaydi. Ob'ekt (yoki Iterable, yoki Stream) qaytariladi. Asl bajarilishi, birinchi marta qiymat olishga harakat qilganda boshlanadi. yield kalit so'ziga yetganda, qiymat "tashqariga" uzatiladi va funksiyaning holati saqlanadi. Tanasi to'xtatiladi. Keyingi qiymatni olishga harakat qilganda, bajarilish to'xtatilgan joydan davom etadi, keyingi yield yoki funksiyaning oxirigacha.
Farqlar:
| Xususiyat | sync* (Sinxron) | async* (Asinxron) |
|---|---|---|
| Qaytadigan tur | Iterable |
Stream |
| Kalit so'zlar | sync*, yield |
async*, yield, yield* |
await foydalanish |
Ruxsat etilgan | Ruxsat etilgan |
| To'xtash | Keyingi qiymat so'ralgunga qadar | Yangi asinxron voqea yuzaga kelgunga qadar |