JAVASCRIPT’IN TARIHÇESI
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());
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?
Iterator Oluşturmak
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());
Async Fonksiyonları Daha Okunur Hale Getirdi
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();
Sonu Olmayan Data Stream Oluşturmak İçin
İ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)
Recursive fonksiyonları normal iterative fonksiyonlara dönüştürür.
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
- Asynchrony: Under the Hood — Shelley Vohr — JSConf EU 2018
- Understanding Generators in ES6 JavaScript with Examples
- What are JavaScript Generators?
Okumaya Devam Et 😃
Bu yazının devamı veya yazı grubundaki diğer yazılara erişmek için bu linke tıklayabilirsiniz.