JavaScript Generatorlar (Generators)
Oddiy JavaScript funksiyalari faqat bitta qiymat qaytarishi mumkin. Generator esa bir nechta qiymatlarni ketma-ket, birin-ketin qaytarish imkoniyatiga ega.
Generatorlarning asosiy afzalligi — ular to'xtatib qo'yilishi (paused) va keyinroq yana davom ettirilishi (resumed) mumkinligidir.
1. Generator funksiyasi: function*
Generator yaratish uchun function kalit so'zidan keyin yulduzcha (*) qo'yiladi:
function* meningGeneratorim() {
yield 1;
yield 2;
yield 3;
}Generator chaqirilganda u darhol qiymat qaytarmaydi, balki Generator Obyektini qaytaradi. Bu obyekt ham iterable, ham iterator protokollariga mos keladi.
2. yield kalit so'zi
yield operatori funksiya bajarilishini to'xtatadi va ko'rsatilgan qiymatni tashqariga (chaqiruvchiga) qaytaradi. Funksiya holati o'sha nuqtada saqlanib qoladi.
Misol
function* sanash() {
yield 1;
yield 2;
yield 3;
}
const g = sanash();
console.log(g.next()); // { value: 1, done: false }
console.log(g.next()); // { value: 2, done: false }
console.log(g.next()); // { value: 3, done: false }
console.log(g.next()); // { value: undefined, done: true }3. for...of bilan ishlatish
Generatorlar iterable bo'lgani uchun ularni for...of tsikli bilan osongina aylanib chiqish mumkin:
for (let qiymat of sanash()) {
console.log(qiymat); // 1, 2, 3
}4. Generator Metodlari
Generator obyekti quyidagi metodlarga ega:
next(): Funksiyani keyingiyieldgacha davom ettiradi.return(qiymat): Generatormi muddatidan oldin tugatadi va berilgan qiymatni qaytaradi.throw(xato): Generator ichida xatolik yuzaga keltiradi.
5. Nima uchun Generatorlar kerak?
- Cheksiz ma'lumotlar oqimi: Masalan, hech qachon tugamaydigan sonlar ketma-ketligini yaratish.
- Xotirani tejash: Barcha ma'lumotlarni massivga yig'masdan, faqat kerak bo'lganda (on-demand) hosil qilish.
- Asinxronlik (Async):
async/awaitchiqishidan oldin, murakkab asinxron operatsiyalarni boshqarishda keng ishlatilgan.
Xulosa
Generatorlar JavaScript-da oqimli ma'lumotlar bilan ishlash va dastur oqimini nazorat qilishning juda kuchli usulidir. Ular yordamida nafaqat oddiy qiymatlar, balki murakkab iteratsiya mantiqlarini ham osonlik bilan amalga oshirish mumkin.
