Sobes.tech
Middle

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