Bu eğiticide, Jeneratörler ve Geri Çağırmalarla olan farkları hakkında bilgi edineceğiz
Jeneratör nedir?
Jeneratörler son zamanlarda Node.js'de oldukça ünlü oldular ve bu muhtemelen yapabildikleri şeyler yüzünden.
- Üreteçler, askıya alınabilen ve daha sonraki bir noktada devam ettirilebilen işlev yürütmeleridir.
- Üreteçler, 'tembel yürütme' gibi kavramları gerçekleştirirken kullanışlıdır. Bu temelde, yürütmeyi askıya alarak ve istediğimiz zaman devam ettirerek, değerleri yalnızca ihtiyacımız olduğunda çekebileceğimiz anlamına gelir.
Jeneratörler aşağıdaki 2 temel yönteme sahiptir
- Getiri yöntemi - Getiri yöntemi, getiri yönteminin çağrıldığı belirli satırda işlevin yürütülmesini durdurmak için bir işlevde çağrılır.
- Sonraki yöntem - Bu yöntem, getiri yöntemine sahip bir işlevin 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ı ekleyecek basit bir Ekle işlevine sahip olacağız, ancak jeneratörlerin nasıl kullanılabileceğini göstermek için farklı noktalarda yöntem yürütmeyi durdurmaya devam edeceğiz.
function* Add(x) {yield x + 1;var y = yield(null);y = 6return x + y;}var gen = Add(5);gen.next();gen.next();
Kod Açıklaması: -
- İlk adım, jeneratör "fonksiyonumuzu" tanımlamaktır. Bunun, function anahtar kelimesine bir "*" ekleyerek yapıldığına dikkat edin. Ardından, x parametresini alan Add adında bir işlev tanımlıyoruz.
- Verim anahtar kelimesi, üreticilere özgüdür. Bu, onu herhangi bir şeyin ortasında bir işlevi duraklatmak için güçlü bir yapı yapar. Yani burada, adım 4'te yapılacak next () işlevini çağırana kadar işlevin yürütülmesi durdurulacaktır. Bu noktada, x'in değeri 6 olacak ve fonksiyonun yürütülmesi durdurulacaktır.
- Burası ilk olarak jeneratör fonksiyonunu çağırdığımız ve 5'in değerini Add fonksiyonumuza gönderdiğimiz yerdir. Bu değer, Add fonksiyonumuzun x parametresinde ikame edilecektir.
- Next () işlevini çağırdığımızda, Add () işlevi yürütmeye devam edecektir. Bir sonraki var y = verim (null) ifadesi çalıştırıldığında, Add () işlevi yeniden çalışmayı durduracaktır.
- Şimdi next () işlevini tekrar çağırdıktan sonra, sonraki ifadeler çalışacak ve x = 5 ve y = 6'nın birleşik değeri eklenecek ve döndürülecektir.
Geri çağırmalar ve oluşturucular
Jeneratörler, geri arama cehennemi olarak bilinen problemi çözmek için kullanılır. Bazen geri arama işlevleri, bir Node.js uygulamasının geliştirilmesi sırasında o kadar iç içe geçer ki, geri arama işlevlerini kullanmak çok karmaşık hale gelir.
Jeneratörlerin yararlı olduğu yer burasıdır. Bunun en yaygın örneklerinden biri, zamanlayıcı işlevleri oluştururken ortaya çıkar.
Jeneratörlerin geri çağırmalara göre nasıl yararlı olabileceğine dair aşağıdaki örneğe bakalım.
Örneğimiz sadece basit bir zaman geciktirme işlevi yaratacaktır. Daha sonra 1000, 2000 ve 3000 ms'lik bir gecikmeyi içeren bu işlevi çağırmak isteriz.
Adım 1) Geri arama fonksiyonumuzu gerekli zaman gecikme kodu ile tanımlayın.
function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}
Kod Açıklaması: -
- Burada ptime adlı bir parametre ile Timedelay adında bir fonksiyon oluşturuyoruz. Bu, başvurumuzda tanıtmak istediğimiz gerekli zaman gecikmesini alacaktır.
- Bir sonraki adım, kullanıcıya uygulamanın bu kadar çok milisaniye için duraklatılacağını söyleyen bir mesaj oluşturmaktır.
Adım 2) Şimdi geri aramaları dahil ediyorsak, koda bakalım. Geri aramaları 1000, 2000 ve 3000 milisaniye değerine dayalı olarak dahil etmek istediğimizi varsayalım, aşağıdaki kod geri aramaları kullanarak bunları nasıl gerçekleştirmemiz 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çıklaması: -
- Zaman gecikmesini değer olarak 1000 ile geri arama olarak adlandırıyoruz.
- Daha sonra Timedelay fonksiyonunu değer olarak 2000 ile tekrar çağırmak istiyoruz.
- Son olarak, Timedelay fonksiyonunu değer olarak 3000 ile tekrar çağırmak istiyoruz.
Yukarıdaki koddan, işlevi birden çok kez çağırmaya başlamak istediğimiz için daha karmaşık hale geldiğini görebilirsiniz.
Adım 3) Şimdi aynı kodun üreteçleri kullanarak nasıl uygulanacağını görelim. Aşağıdaki koddan, artık jeneratörleri kullanarak Timedelay işlevini uygulamanın ne kadar kolay 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çıklaması: -
- İlk olarak Timedelay fonksiyonumuzu çağırmak için kullanılacak bir jeneratör fonksiyonu tanımlıyoruz.
- Parametre değeri olarak 1000 ile Timedelay fonksiyonu ile birlikte Getiri fonksiyonunu çağırıyoruz.
- Daha sonra, Timedelay fonksiyonu ile birlikte Getiri fonksiyonunu parametre değeri olarak 2000 ile çağırıyoruz.
- Son olarak, Timedelay fonksiyonu ile birlikte Getiri fonksiyonunu parametre değeri olarak 3000 ile çağırıyoruz.
Özet
Oluşturucular, iç içe geçmiş geri aramalarla ilgili sorunları hafifletmek ve geri arama cehennemi olarak bilinen şeyin kaldırılmasına yardımcı olmak için de kullanılabilir. Oluşturucular, bir işlevin işlenmesini durdurmak için kullanılır. Bu, eşzamansız işlevde 'verim' yönteminin kullanılmasıyla gerçekleştirilir.