JavaScript'te Jeneratör Fonksiyonlar

JavaScript'te Jeneratör Fonksiyonlar

Bu makalede, JavaScript'teki jeneratör fonksiyonları açıklayacağız.

YouTube Video

JavaScript'te Jeneratör Fonksiyonlar

JavaScript jeneratör fonksiyonları, tembel yürütme ve durma ve devam etme yapabildiği için normal fonksiyonlardan farklı olan özel fonksiyonlardır. Jeneratör fonksiyonları anlayarak, büyük veri işlemlerinin sıralı işlenmesi ve asenkron işlemlerle verimli bir şekilde başa çıkabilirsiniz. Burada, jeneratör fonksiyonların nasıl çalıştığını, nasıl kullanılacağını ve pratik kullanım durumlarını ayrıntılı olarak açıklayacağız.

Jeneratör Fonksiyonlar Nedir?

Bir jeneratör fonksiyonu, function* (bir yıldız işareti ile tanımlanmış bir fonksiyon) ile tanımlanır ve normal fonksiyonlardan farklı olarak, yürütmeyi ortadan kesip durabilir ve durumunu koruyarak devam edebilir. Jeneratör fonksiyonlar, "tembel yürütme" sağlar ve sonuçları kademeli olarak döndürerek verimli bellek yönetimi ve sıralı işleme olanak tanır.

Sözdizimi

1function* generatorFunction() {
2    yield 'First value';
3    yield 'Second value';
4    return 'Done';
5}

Bu şekilde, bir jeneratör fonksiyonu birden fazla yield ifadesi içerebilir ve yürütmeyi durdurmak için yield kullanabilir. Bir jeneratör fonksiyonu çağrıldığında, fonksiyonun gövdesi hemen çalıştırılmaz ve bir jeneratör nesnesi döndürülür. Bu nesnede next() metodunu çağırarak fonksiyonu durduğu yerden devam ettirebilirsiniz.

Jeneratör Fonksiyonların Temel Kullanımı

Şimdi, jeneratör fonksiyonları kullanmanın temel bir örneğine göz atalım.

 1function* simpleGenerator() {
 2    yield 1;
 3    yield 2;
 4    yield 3;
 5}
 6
 7const gen = simpleGenerator();
 8
 9console.log(gen.next()); // { value: 1, done: false }
10console.log(gen.next()); // { value: 2, done: false }
11console.log(gen.next()); // { value: 3, done: false }
12console.log(gen.next()); // { value: undefined, done: true }

Burada dikkat edilmesi gereken önemli bir nokta, jeneratörün her seferinde yield ile değerler döndürdüğüdür ve done özelliği false olduğu sürece daha fazla değer olduğunu belirtir. Son next() çağrısı done: true döndürür, bu da jeneratörün tamamlandığını gösterir.

yield Anahtar Kelimesi ve Duraklama Değerleri

yield, jeneratör fonksiyonu içinde bir duraklama noktasını gösteren bir anahtar kelimedir. yield'in sağındaki değer, next() çağrıldığında döndürülür. Ayrıca yield, iki yönlü iletişime olanak tanır. Başka bir deyişle, next() metoduna bir argüman olarak bir değer geçirildiğinde, bu değer jeneratör fonksiyonuna gönderilir.

 1function* generatorWithYield() {
 2    const value1 = yield 'First yield';
 3    console.log('Received value:', value1);
 4    const value2 = yield 'Second yield';
 5    console.log('Received value:', value2);
 6}
 7
 8const gen = generatorWithYield();
 9
10console.log(gen.next());        // { value: 'First yield', done: false }
11console.log(gen.next('Apple')); // Received value: Apple
12                                // { value: 'Second yield', done: false }
13console.log(gen.next('Banana'));// Received value: Banana
14                                // { value: undefined, done: true }

Bu örnekte, next('Apple') çağrısı, 'Apple' değerini jeneratör fonksiyonuna gönderir ve bu değer fonksiyon içinde kullanılır.

Jeneratör Durumunun Yönetimi

Jeneratörler, uzun döngülerin veya sıralı işlemenin özlü bir şekilde temsil edilmesine olanak tanıyan yürütme durumlarını koruyabilir. Aşağıdaki örnek, sonsuz sayılar üreten bir jeneratörü göstermektedir.

 1function* infiniteGenerator() {
 2    let i = 0;
 3    while (true) {
 4        yield i++;
 5        if (i > 10) {
 6            break;
 7        }
 8    }
 9}
10
11const gen = infiniteGenerator();
12
13console.log(gen.next().value); // 0
14console.log(gen.next().value); // 1
15console.log(gen.next().value); // 2
16// Continues...

Bu jeneratör, while(true) döngüsü kullanarak sürekli sayılar üretir ve gerektiğinde değerler almanızı sağlar. Bu, büyük veri kümelerinin verimli bir şekilde işlenmesini sağlar.

Jeneratör Fonksiyonlarının Uygulamaları

Jeneratör fonksiyonları, birden fazla işlemi sırayla yürütmek için uygundur. Örneğin, API isteklerini sırayla işlemek veya büyük dosyaları bölerek işlemek için faydalıdırlar.

1function* apiRequestGenerator() {
2    yield fetch('https://codesparklab.com/json/example1.json');
3    yield fetch('https://codesparklab.com/json/example2.json');
4    yield fetch('https://codesparklab.com/json/example3.json');
5}

Dolayısıyla, asenkron işlem için kullanılabilen jeneratörler, verilerin verimli bir şekilde sırayla işlenmesi için büyük fayda sağlar.

Asenkron Jeneratörler

ES2018'de tanıtılan asenkron jeneratörler, async ve yield öğelerini birleştirerek, asenkron değerleri sırayla döndürmenizi sağlar. Bu, await ile birlikte asenkron işlemleri sade bir şekilde yazmayı mümkün kılar.

Sözdizimi

 1async function* asyncGenerator() {
 2    yield await Promise.resolve(1);
 3    yield await Promise.resolve(2);
 4    yield await Promise.resolve(3);
 5}
 6
 7const gen = asyncGenerator();
 8
 9(async () => {
10    for await (const value of gen) {
11        console.log(value); // 1, 2, 3
12    }
13})();

Asenkron jeneratörler, for await...of döngüsü kullanarak değerleri sırayla alabilir. Bu desen, özellikle asenkron veri akışlarını işlerken oldukça kullanışlıdır.

Pratik Örnek: Jeneratörlerle Asenkron İşlemleri Basitleştirme

Jeneratör fonksiyonları, asenkron işlemlerin akışını basitleştirmek için de kullanılır. Örneğin, aşağıda gösterildiği gibi, yield ve Promise öğelerini birleştirerek asenkron işlemleri eşzamanlı gibi yazabilirsiniz.

 1function* asyncFlow() {
 2    const data1 = yield fetch('https://codesparklab.com/json/example1.json');
 3    console.log(data1);
 4    const data2 = yield fetch('https://codesparklab.com/json/example2.json');
 5    console.log(data2);
 6}
 7
 8const gen = asyncFlow();
 9
10function handleAsync(generator) {
11    const next = (promise) => {
12        promise.then((result) => {
13        const { value, done } = generator.next(result);
14        if (!done) {
15            next(value);
16        }
17        });
18    };
19
20    next(generator.next().value);
21}
22
23handleAsync(gen);

Bu kod, bir jeneratör kullanarak API isteklerini sırayla yapar ve sonuçları işler.

Özet

Jeneratör fonksiyonları, bir fonksiyonun yürütülmesini durdurup yeniden başlatma yeteneğine sahip olduğundan, JavaScript'in güçlü özelliklerinden biridir. Bu, sıralı işleme, asenkron işleme ve büyük veri kümelerinin verimli bir şekilde yönetilmesini sağlar. Jeneratörleri anlamak, JavaScript'te ileri teknikleri öğrenmede önemli bir adımdır.

Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.

YouTube Video