function* observerGenerator() {
while (true) {
console.log(`Value passed: ${yield}`);
}
}
const obs = observerGenerator();
obs.next('first');
obs.next('second');
obs.next('third');
Gəlin bu generator funksiyasının necə işlədiyini addım-addım izah edək ki, niyə yalnız "second" və "third" dəyərləri ekrana çıxır, anlaşılsın.
Addım-addım izah:
Addım 1: Generator yaradılır
const obs = observerGenerator();
Bu sətir observerGenerator generator funksiyasını başlatmır, sadəcə obs adlı generator obyektini yaradır.
Addım 2: obs.next('first')
Generator ilk dəfə next('first') ilə işə salınır.
obs.next('first');
Vacib məqam: Generatorlar yield sətrinə çatana qədər kodu işlətməyə başlayır. Bizim generatorda ilk sətir bu olur:
console.log(`Value passed: ${yield}`);
Burada yield ifadəsi özündə dəyəri saxlayır, amma ilk dəfə next() çağırıldıqda, yield-ə verilən dəyər gözlənilmir, çünki generator hələ dayanmamışdı.
Yəni obs.next('first') çağırıldıqda:
Generator işə düşür,
yield-ə gəlib dayanır,
Amma yield-ə dəyər ötürülmür, ona görə də console.log(...) işləmir.
Addım 3: obs.next('second')
İndi isə yield artıq dayandığı yerdə gözləyir. Biz second dəyərini ötürürük:
obs.next('second');
Bu dəyər birbaşa yield ifadəsinə ötürülür
console.log(...) artıq işləyir və:Value passed: second
Addım 4: obs.next('third')
Bu dəfə eyni proses təkrar olunur:
obs.next('third');
third dəyəri yenə yield-ə ötürülür,
console.log(...) işləyir:Value passed: third
Nəticə:
Yalnız ikinci və üçüncü next() çağırışlarında console.log() işləyir, çünki:
İlk next() generatoru yield-ə qədər aparır və heç bir dəyər ötürmür (sadəcə start verir).
Sonrakı next(dəyər) çağırışları isə yield-ə dəyər ötürür və nəticədə console.log() işləyir.
Qısa xülasə:
next() çağırışı
yield-ə nə ötürülür?
Nəticə
obs.next('first')
Heç nə
console.log() işləmir
obs.next('second')
'second'
Çıxış: Value passed: second
obs.next('third')
'third'
Çıxış: Value passed: third