Generatorlar

Frontend SELF AZ
Səviyyə , Dərs
Mövcuddur

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:

JavaScript
    
      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:

JavaScript
    
      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ər
  • done: 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:

JavaScript
    
      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ı:

JavaScript
    
      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:

JavaScript
    
      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ə:

JavaScript
    
      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ə:

JavaScript
    
      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:

JavaScript
    
      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

JavaScript
    
      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

JavaScript
    
      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.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION