2.1 Generatorların Sintaksisi
JavaScript-də generatorlar xüsusi funksiyalardır ki, kodun icrasını idarə etməyə imkan verir. Onlar öz icrasını dayandıra və sonra bərpa edə bilərlər ki, bu da onları asinxron kod, iteratory və digər mürəkkəb tapşırıqlarla işləmək üçün güclü alət edir.
Generatorlar function*
funksiyasının köməyi ilə təyin edilir (ulduza diqqət yetirin). Generatorun içində yield
operatoru istifadə olunur ki, icranı dayandırsın və dəyəri geri qaytarsın.
Generatorun təyini:
function* generatorFunction() {
yield 1;
yield 2;
yield 3;
}
Generator obyektinin yaradılması
Generatoru çağırmaq onun gövdəsini dərhal çalışdırmır. Bunun yerinə o, generator obyektini qaytarır, hansı ki, dəyərləri iterasiya etmək üçün istifadə oluna bilər:
const gen = generatorFunction();
2.2 Generatorlardan istifadə
next() metodu
next()
metodu generatorun icrasını növbəti yield
operatoruna qədər davam etdirmək üçün istifadə olunur. Bu metod iki xüsusiyyəti olan obyekt qaytarır:
value
:yield
operatorundan qaytarılan dəyərdone
: generator tamam olub-olmadığını göstərən məntiqi bir dəyişən (true
) ya da tamamlanmadığını göstərir (false
)
next() metodunun istifadəsinə misal:
function* generatorFunction() {
yield 1;
yield 2;
yield 3;
}
const gen = generatorFunction();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }
Generatorla iterasiya
Generatorlardan dəyərlər üzrə iterasiya etmək üçün for...of
dövrü istifadə oluna bilər.
Generatorla iterasiya misalı:
function* generatorFunction() {
yield 1;
yield 2;
yield 3;
}
const gen = generatorFunction();
for (const value of gen) {
console.log(value);
}
// Çap edəcək: 1
// Çap edəcək: 2
// Çap edəcək: 3
Dəyərlərin qaytarılmasına misal
Generatorlar return
operatorundan istifadə edərək dəyər qaytara bilər:
function* generatorFunction() {
yield 1;
yield 2;
return 3;
yield 4; // Bu yield heç vaxt işə düşməyəcək
}
const gen = generatorFunction();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: true }
console.log(gen.next()); // { value: undefined, done: true }
2.3 Generatorlardan mürəkkəb istifadə
Generatorla qarşılıqlı əlaqə
next()
metodu bir arqument qəbul edə bilər, bu da generatora ötürülür və onun içində istifadə oluna bilər.
Generatora dəyərlərin ötürülməsinə nümunə:
function* generatorFunction() {
const value1 = yield 1;
const value2 = yield value1 + 2;
yield value2 + 3;
}
const gen = generatorFunction();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next(10)); // { value: 12, done: false }
console.log(gen.next(20)); // { value: 23, done: false }
console.log(gen.next()); // { value: undefined, done: true }
Xətaların emalı
Generatorlar xətaları try...catch
bloku vasitəsilə işləməyə imkan verir.
Xətanın emalına nümunə:
function* generatorFunction() {
try {
yield 1;
yield 2;
} catch (error) {
console.log('Xəta aşkarlandı:', error);
}
}
const gen = generatorFunction();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.throw(new Error('Nəsə səhv baş verdi'))); // Xəta aşkarlandı: Error: Nəsə səhv baş verdi
// { value: undefined, done: true }
Sonuz ardıcıl yaratmaq üçün generator nümunəsi
Generatorlardan sonsuz ardıcıllıqlar yaratmaq üçün istifadə edilə bilər:
function* infiniteSequence() {
let i = 0;
while (true) {
yield i++;
}
}
const gen = infiniteSequence();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// və s.
2.4 Praktiki istifadəyə dair nümunələr
Nümunə 1: Bir obyekti itere etmək üçün generator
function* objectEntries(obj) {
const keys = Object.keys(obj);
for (const key of keys) {
yield [key, obj[key]];
}
}
const obj = { a: 1, b: 2, c: 3 };
const gen = objectEntries(obj);
for (const [key, value] of gen) {
console.log(`${key}: ${value}`);
}
// Çıxış edəcək:
// a: 1
// b: 2
// c: 3
Nümunə 2: Sadə iterator yaratmaq üçün generator
const myIterable = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
}
};
for (const value of myIterable) {
console.log(value);
}
// Çıxış edəcək: 1
// Çıxış edəcək: 2
// Çıxış edəcək: 3
JavaScript-də generatorlar kodun icrasını idarə etmək, iterator yaratmaq və asinxron əməliyyatlarla işləmək üçün güclü bir vasitədir. Generatorların sintaksisini və istifadəsini anlamaq, xüsusən məlumat ardıcıllıqları və asinxron tapşırıqlarla işləyərkən daha çevik və oxunaqlı kod yaratmağa kömək edir.
GO TO FULL VERSION