Photo by Jayphen Simpson on Unsplash

Javascript’de Generators

Javascript Generators Nedir, Async/await bu mekanizma üzerinde mi çalışıyor ? Iteration işleyişinde ne gibi yenilikler getiriyor ?

Bu yazıyı daha önceden yazmış olduğum Javascript’in Tarihçesi yazı dizisinin bir devamı olarak yazıyorum. Bir çok kavramı tek bir yazıda ele almanın yaratacağı karmaşıklıktan kaçmak için bu şekilde bir yönteme başvurdum. Bu yazılardaki amacım önceden Javascript’in varolan hangi özelliklerinin yetmediğini ve bu geliştirmeyle neyi hedeflediklerini anlatacağım.

Bu blog yazımda özetle;

  • Generator Fonksiyonun Diğer Fonksiyon Türleri içerisindeki Yeri
  • Generator Fonksiyon Nedir?
  • Generator Fonksiyonun Metodları Nelerdir?
  • Generator Kullanım Alanları Nelerdir?
  • Generator Sağladığı Avantajlar Nelerdir?

1. Generator Fonksiyonun Diğer Fonksiyon Türleri içerisindeki Yeri

Generator daha önceden de bahsettiğim işleyiş türlerine göre fonksiyon türlerinden (Asnyc, Sync, Generator) biridir. Neydi bu fonksiyonlar (Fonksiyonları daha detaylı anlattığım Arrow Functions yazısını okuyabilirsiniz.)

  • İsimlendirmelerine Göre Fonksiyon Türleri: (Regular/Named Functions, Anonymous Functions)
  • İşlevlerine Göre Fonksiyon Türleri: (Pure Functions, Constructor Functions, IIFE, High Order Functions)
  • İşleyiş Türlerine Göre: (Asynchronous Functions, Synchronous Functions, Generator Functions)
  • Gösterimlerine Göre Fonksiyon Türleri: (Normal Functions, Arrow Functions)

2. Generator Fonksiyon Nedir?

Normalde fonksiyonlar 3 şekilde sonlanır.

  • fonksiyonun işleminin tamamlanması.
  • return fonksiyonu sonuç dönmesi
  • throw ile hata dönmesi

Generator fonksiyona sanki bir iterator gibi davranıp, fonksiyon içerisinde akışı durdurup ilerletebildiğiniz bir mekanizmaya dönüştürür. Bu ne demek şimdi. Aşağıdaki fonksiyonda sayHello() fonksiyonunu çağırdığımızda tüm fonksiyon hemen işletilir ve sonuç size döner. Diyebilirsiniz ki async/await fonksiyonları hemen işletilmez. Fonksiyon Async işlem için bekletilir zaten bu fonksiyon tipide Generator yapısı üzerinde çalıştırılır.

function sayHello(){
console.log("Hello");
console.log("Word");
}
sayHello();

Generator fonksiyonu önünde * ile tanımlayıp içerisinde yield ile akışı kontrol edeceğiniz yerleri belirtip, fonksiyonun akışını dışarıdan .next() ile ilerleterek kullanabilirsiniz.

function * sayHelloGenerator(){
yield console.log("Hello");
yield console.log("Word");
}
const genHello=sayHelloGenerator();
genHello.next();
genHello.next();

Burda 2 fonksiyon türünün işleyişi gösterilmiştir. Birincisinde fonksiyonun işleyişine etki edemezken , generator fonksiyonunda iterator ile programı durdurup ilerletmek bizim kontrolümüzdedir.

Burda yield return gibi davranır fakat return sadece value dönmez aynı zamanda fonksiyonun tamamlanması ile ilgili sonucuda döner.

function * sayHelloGenerator(){
yield "Hello";
yield "World";
}
const genHello=sayHelloGenerator();
console.log(genHello.next());
console.log(genHello.next());
console.log(genHello.next());
Program İşletilince çıkan sonuç

3. Generator Fonksiyonun Metodları

function * ile generator fonksiyonu oluşur ve bunun next(), return ve throw metodları bulunur.

  • next() : sonrasında bir obje döner. Bu obje yield dönecek value ve fonksiyonun tamamlanıp, tamamlanmadığı bilgisi olan done değerini döner
  • return(): generator fonksiyonun sonlanmasını sağlar. Ve return içerisinde geçirilen değeri ile birlikte fonksiyonun bittiği bilgisi döner.
  • throw(): generator fonksiyonun sonlanmasını sağlar. Ve hata mesajı try/catch içerisinde yakalanır.

4. Generator Kullanım Alanları Nelerdir?

Normal kendi iterator fonksiyonunuzu yazmak istediğinizde next() metodlu objeler oluşturup gezinme yöntemlerini implement etmeniz gerekiyor. Generator fonksiyonları bunlar için default bir altyapı sağlıyor.

Örneğin Array İterator yazmak isterseniz. Aşağıdaki şekilde basitçe yazabilirsiliz.

function *arrIterator(arr){
for(let i=0;i<arr.length;i++){
yield arr[i];
}
}
const itr=arrIterator([1,2,3,4,5]);
console.log(itr.next());
console.log(itr.next());

Promise fonksiyonları Generator fonksiyonları ile daha okunaklı halde yazabilirsiniz. Async/await gibi Generator ile metodları iteration işletebilirsiniz.

Promise örnek

const waitThenCall = (msg) => { 
return new Promise((resolve, reject) => {
setTimeout(() => {resolve(msg + “success”) }, 1000)});}

waitThenCall(“Hello1_”)
.then((data) => { console.log(data)
return waitThenCall(“Hello2_”)}, (err)=>{})
.then((data) => { console.log(data)
return waitThenCall(“Hello3_”)}, undefined)
.then((data) => { console.log(data)})
.catch(err) => {console.log(err+"X")})

Generator ile daha okunabilir hale getirmek için

const waitThenCall = (msg) => { 
return new Promise((resolve, reject) => {
setTimeout(() => { resolve(msg + "success") }, 2000)});}
function* run
try{

const result=yield waitThenCall("Hello1");
console.log(result)
const result2=yield waitThenCall("Hello2");
console.log(result2)
console.log("Hello")
}catch(e){
console.log(e);
}
}
const runItr=run();
runItr.next();

İstediğiniz türde sonsuz veri dizileri oluşturabilecek fonksiyonlar oluşturabilirsiniz.

function * evenNumbers() {
let num = 0;
while (true) {
yield num;
num = num + 2
}
}
const numbers = evenNumbers();
console.log(numbers.next().value)
console.log(numbers.next().value)
function * fibonacci(seed1, seed2) {
while (true) {
yield (() => {
seed2 = seed2 + seed1;
seed1 = seed2 - seed1;
return seed2;
})();
}
}
const fib = fibonacci(0, 1);
console.log(fib.next());
console.log(fib.next());
console.log(fib.next());

4. Generator Sağladığı Avantajlar Nelerdir?

Lazy Evaluation ile istenen değer daha sonra işletilerek oluşturulur. Bu sayede değeri önceden oluşturmak için CPU harcanmaz. Bu değerler bir bellekte fazladan yer tutulmadığı için Memory Efficient(bellek efektif) çalışmasını sağlar.

Generator fonksiyonlar oluşturulur ve tüketilir. Tükenen işlenen bir generator tekrar tekrar kullanılamaz tekrardan oluşturulması gerekir. Bir sefer erişilebilir yani.

Referanslar

Okumaya Devam Et 😃

Bu yazının devamı veya yazı grubundaki diğer yazılara erişmek için bu linke tıklayabilirsiniz.

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store