node.js Generator& Geri Aramalarla Karşılaştır
Bu eğitimde şunları öğreneceğiz: GeneratorGeri Aramalarla arasındaki farklar ve farklılıkları
Jeneratörler nelerdir?
Generatoroldukça meşhur oldular node.js son zamanlarda ve bu muhtemelen yapabileceklerinden kaynaklanıyor.
- Generators, daha sonra askıya alınabilen ve devam ettirilebilen fonksiyon yürütmeleridir.
- Generator'Tembel yürütme' gibi kavramları gerçekleştirirken kullanışlıdır. Bu temel olarak yürütmeyi askıya alarak ve istediğimiz zaman devam ettirerek değerleri yalnızca ihtiyacımız olduğunda alabileceğimiz anlamına gelir.
Generatoraşağıdaki 2 temel yönteme sahiptir.
- Verim yöntemi – Bir fonksiyonda, verim metodunun çağrıldığı belirli satırda fonksiyonun yürütülmesini durdurmak için verim metodu çağrılır.
- Sonraki yöntem – Bu yöntem, verim yöntemine sahip bir fonksiyonun yürütülmesine devam etmek için ana uygulamadan çağrılır. Fonksiyonun yürütülmesi bir sonraki verim yöntemine veya yöntemin sonuna kadar devam edecektir.
Jeneratörlerin nasıl kullanılabileceğine dair bir örneğe bakalım.
Örneğimizde, 2 sayıyı toplayacak basit bir Ekleme fonksiyonumuz olacak, ancak üreteçlerin nasıl kullanılabileceğini göstermek için metodun çalışmasını farklı noktalarda durduracağız.
function* Add(x) { yield x + 1; var y = yield(null); y = 6 return x + y; } var gen = Add(5); gen.next(); gen.next();
Kod Açıklama
- İlk adım, jeneratör "fonksiyonumuzu" tanımlamaktır. Bunun, fonksiyon anahtar sözcüğüne bir "*" eklenerek yapıldığını unutmayın. Daha sonra x parametresi alan Add adlı bir fonksiyon tanımlıyoruz.
- yield anahtar sözcüğü jeneratörlere özgüdür. Bu, onu herhangi bir şeyin ortasında bir işlevi duraklatmak için güçlü bir yapı haline getirir. Yani burada, işlev yürütmesi, Adım 4'te yapılacak olan next() işlevini çağırana kadar durdurulacaktır. Bu noktada, x'in değeri 6 olacak ve işlevin yürütülmesi durdurulacaktır.
- Burada ilk önce jeneratör fonksiyonunu çağırıyoruz ve 5 değerini Add fonksiyonumuza gönderiyoruz. Bu değer Add fonksiyonumuzun x parametresinde ikame edilecektir.
- next() fonksiyonunu çağırdığımızda, Add() fonksiyonu yürütmeye devam edecektir. Bir sonraki var y= verim(null) ifadesi yürütüldüğünde, Add() işlevi yeniden çalışmayı durduracaktır.
- Şimdi next() işlevi tekrar çağrıldıktan sonra sonraki ifadeler çalışacak ve x=5 ile y=6'nın birleşik değeri toplanacak ve döndürülecektir.
Geri aramalar ve üreteçler
Generatorgeri arama cehennemi olarak bilinen sorunu çözmek için kullanılır. Bazen bir Node.js uygulamasının geliştirilmesi sırasında geri çağırma işlevleri o kadar iç içe geçer ki, geri çağırma işlevlerini kullanmak çok karmaşık hale gelir.
Jeneratörlerin faydalı olduğu yer burasıdır. Bunun en yaygın örneklerinden biri zamanlayıcı fonksiyonları oluştururkendir.
Jeneratörlerin geri çağırmalara göre nasıl daha kullanışlı olabileceğini gösteren aşağıdaki örneği inceleyelim.
Örneğimiz sadece basit bir zaman gecikme fonksiyonu yaratacaktır. Daha sonra 1000, 2000 ve 3000 ms'lik bir gecikmeyi içeren bu fonksiyonu çağırmak isteriz.
) 1 Adım Geri arama fonksiyonumuzu gerekli zaman gecikme koduyla tanımlayın.
function Timedelay(ptime, callback) { setTimeout(function() { callback("Pausing for " + ptime); }, time); }
Kod Açıklama
- Burada ptime isimli parametre ile Timedelay isimli bir fonksiyon oluşturuyoruz. Bu, uygulamamızda sunmak istediğimiz gerekli zaman gecikmesini alacaktır.
- Bir sonraki adım, kullanıcıya uygulamanın bu kadar milisaniye boyunca duraklatılacağını söyleyen bir mesaj oluşturmaktır.
) 2 Adım Şimdi geri aramaları dahil ediyorsak koda bakalım. 1000, 2000 ve 3000 milisaniyelik değere dayalı geri aramaları dahil etmek istediğimizi varsayalım; aşağıdaki kod, geri aramaları kullanarak bunları nasıl uygulamamız gerektiğini gösterir.
Timedelay(1000, function(message) { console.log(msg); Timedelay(2000, function(message) { console.log(msg); Timedelay(3000, function(message) { console.log(msg); }) }) })
Kod Açıklama
- Timedelay'i, değeri 1000 olan bir geri arama olarak çağırıyoruz.
- Daha sonra Timedelay fonksiyonunu 2000 değeriyle tekrar çağırmak istiyoruz.
- Son olarak Timedelay fonksiyonunu 3000 değeriyle tekrar çağırmak istiyoruz.
Yukarıdaki koddan, işlevi birden çok kez çağırmaya başlamak istediğimiz için durumun daha da karmaşık hale geldiğini görebilirsiniz.
) 3 Adım Şimdi aynı kodu jeneratörler kullanarak nasıl uygulayacağımıza bakalım. Aşağıdaki koddan jeneratörler kullanarak Timedelay fonksiyonunu uygulamanın ne kadar basit hale geldiğini görebilirsiniz.
function* Messages() { console,log(yield(Timedelay(1000, function(){}))); console,log(yield(Timedelay(2000, function(){}))); console,log(yield(Timedelay(3000, function(){}))); }
Kod Açıklama
- İlk olarak Timedelay fonksiyonumuzu çağırmak için kullanılacak bir üreteç fonksiyonu tanımlıyoruz.
- Parametre değeri 1000 olan Timedelay fonksiyonuyla birlikte Yield fonksiyonunu da çağırıyoruz.
- Daha sonra parametre değeri 2000 olan Timedelay fonksiyonuyla birlikte Yield fonksiyonunu çağırıyoruz.
- Son olarak parametre değeri 3000 olan Timedelay fonksiyonu ile birlikte Yield fonksiyonunu da çağırıyoruz.
ÖZET
Generators ayrıca iç içe geçmiş geri aramalarla ilgili sorunları hafifletmek ve geri arama cehennemi olarak bilinen şeyin ortadan kaldırılmasına yardımcı olmak için de kullanılabilir. Generators, bir fonksiyonun işlenmesini durdurmak için kullanılır. Bu, asenkron fonksiyonda 'yield' metodunun kullanımıyla gerçekleştirilir.