İçinde Node.js ortamda bulunan nesnelerin çoğu olay yayar, örneğin bir TCP sunucusu bir tür olay yayar bağlamak yeni bir istemci her bağlandığında veya bir dosya akışı, bir bilgi parçası her okunduğunda bilgi yayar.
Bu Node.js Geliştiricilerin bir işleve abone olduğu olaylara abone olma olasılığını sağlayan olay yayıcılar olarak adlandırılan şeydir. geri çağırmak bu, olay yayıcıda her olay meydana geldiğinde çağrılır. Sözde sınıf sayesinde kendi olay yayıcılarımızı bile oluşturabiliriz. Olay Verici.
Ancak olay yayıcılara girmek için öncelikle bu işlevlerin bazı kalıpları, olay türleri ve hatta dinleyiciler gibi bazı kavramlar hakkında net olmalıyız.
GereksinimlerBu eğitimde önerilen alıştırmaları gerçekleştirmek için işlevsel bir kuruluma sahip olmalıyız. Node.js sistemimizde, araştırmaya devam etmeden önce bu eğiticiye bir göz atabiliriz. Örnekleri kodlamak için zengin bir metin düzenleyiciye erişebilmek de önemlidir, rahat hissettiğimiz her şeyi kullanabiliriz, ancak kullanım kolaylığı için öneririz. Yüce metin o Sözdizimi için eklentileri de olan NotePad ++ JavaScript Y HTML.
Geri aramalar için desen
Asenkron programlama, o fonksiyonun henüz bittiğini belirtmek için fonksiyonlardaki değerlerin dönüşünü kullanmaz, ancak programımızın devam edebilmesi için işlem tamamlandıktan sonra ünlü geri çağırmayı çağırır. JavaScript Bu tür bir programlamaya öncülük ediyorum, bir örnek görelim Verme bir dosyayı okur ve içeriğini belleğe yükler:
var fs = gerektirir ('fs'); fs.readFile ('file.txt', function (err, fileContent) {if (err) {throw err;} console.log ('Dosya içeriği:', fileContent.toString ());});Burada yaptığımız şey, fonksiyonun ikinci argümanı olarak isimsiz bir fonksiyon gönderiyoruz. fs.readDosyave geri çağırma işlevinin ilk argümanının bir hata oluştuğunda Error sınıfının bir örneğine sahip olacak bir error nesnesi olduğunu nasıl görebiliriz.
Olay yayıcı için desen
Yürütmekte olduğumuz bir işlevin işini bitirdiğini bildirmek istediğimizde önceki stil mükemmel çalışır, ancak bu yürütme sırasında veya birçok kez birden fazla olayın gerçekleşmesi durumunda, bu stil istediğimiz gibi çalışmayacaktır. Örneğin, sokette her bilgi mevcut olduğunda bilgilendirilmek istiyorsak, tip bir fonksiyon geri çağırmak standart bize pek yardımcı olmayacak, ancak olay yayıcının bize yardımcı olabileceği yer burasıdır.
Olay yayıcı, adından da anlaşılacağı gibi, bir olay yayan bir nesneden başka bir şey değildir. dinleyici bu emitöre bağlanan ve aşağıdakiler gibi belirli olay türlerini dinleyen kodun bir parçasıdır:
var req = http.request (seçenekler, işlev (yanıt) {yanıt.on ("veriler", işlev (veriler) {console.log ("Bazı yanıt verileri", veriler);}); yanıt.on (" bitiş " , function () {console.log (" tamamlanan yanıt ");});}); istek.son ();Bu tamamen açıklayıcı bir koddur, burada istek yapmak için bazı adımları görebiliriz. HTTP uzak bir sunucuya, ancak yanıt nesnesinin nasıl bir olay yayıcı olduğunu görmemize izin verir; veri Y son ama diğer olay türleri benzer.
Olay türleri
Önceki örneğe göre, yayılan olayların her zaman bir dize ile temsil edilen bir türü olduğunu görebilirdik, bu durumda "veri"Y"son”, Olayı düzenleyen tarafından belirlenen isteğe bağlı dizeler olacaktır.
Olay yayıcı, her tür olaya hizmet eden genel bir arayüzdür, ancak uygulanmasında özel bir durum vardır. Verme ve olaydır hata, ortamdaki her olay, her hata oluştuğunda bu tür bir olay yayar ve geliştirici bu tür olayı dinlememeyi seçer ve bir hata oluşursa, olay yayıcı bunu fark eder ve bu durumda bir istisna oluşturur. . Bu davranışı nasıl simüle edebileceğimizi aşağıdaki kodda görelim:
var em = new (require ('events'). EventEmitter) (); em.emit ('event1'); em.emit ('hata', yeni Hata ('Benim hatam'));Konsoldan çalıştırırsak nasıl olduğunu görebiliriz. Verme bize hatayı ele almadığımızı söyler ve böylece yakalanmamış bir istisna oluşturur:
Olayların nasıl davrandığını genel olarak gördüğümüze göre, olay yayıcı API'sini nasıl kullandığımıza bakalım.
Olay yayıcı API'sini kullanma
Olay yayıcı desenini uygulayan herhangi bir nesne, aşağıda görebileceğimiz gibi bir dizi olayı uygular:
.addListener - .onBu metot, bir olay tipine bir dinleyici eklememizi sağlar.
.onbirBu yöntemle bir dinleyiciyi en az bir kez çağrılacağı verilen bir olay türüne bağlayabiliriz.
.removeEventListenerBu yöntem, herhangi bir olaydan bir dinleyiciyi çıkarmamıza izin verecektir.
.removeAllEventListenersSon olarak, bu yöntem, belirli bir olay türü için tüm dinleyicileri kaldırmamıza yardımcı olur.
Bunların her birinin işlevinin ne olduğunu gördükten sonra, bunları programlarımızda nasıl kullandığımızı görelim.
Geri aramalarda .addListener () veya .on () kullanma
Bir olay türü ve bir işlev belirterek geri çağırmak, belirli bir olay meydana geldiğinde yapılacak eylemi kaydedebiliriz. Örneğin, verinin bir bölümünün mevcut olduğu konusunda bilgilendirilmek istiyorsak ve veri türünde bir olay yayarsak, aşağıdakileri yapabiliriz:
function almaData (veri) {console.log ("Veriler elde edildi:% j", veri); } readFlow.addListener ("veri", almaData);Yöntemi de kullanabiliriz .üzerinde () bu sadece bir kısayol, hadi önceki kodun eşdeğerini görelim:
function almaData (veri) {console.log ("Veriler elde edildi:% j", veri); } readFlow.on ("veri", almaData);Aynı vericide aynı tür olayı dinlemek için olaylarımıza birden fazla dinleyici bile ekleyebiliriz, örneğin:
Bu örnekte, veri türü olayına iki işlevin bağlanması yapılır ve burada veri olayı yayınlandığında, her iki dize de yazdırılır. Olayı düzenleyenin tüm aramalardan sorumlu olduğunu unutmamak önemlidir. dinleyiciler bir olay türü için kayıtlıdır ve onları kayıtlı oldukları sırayla arayacaktır, bu şu anlama gelir:
- Bir dinleyici olay yayınlandıktan hemen sonra aranamaz, diğer dinleyicilerin daha önce aranmış olması mümkündür.
- İstisnaları yakalamamak, kodumuz için sağlıksız bir davranıştır, bu nedenle bu dinleyicilerden herhangi biri bir hata atarsa ve yakalanmazsa, aşağıdaki örnekte bunu gösterebileceğimiz bazı dinleyicilerin çağrılmaması mümkündür:
Bu örnekte, birincisi bir hata verdiği için ikinci dinleyici çağrılmayacak.
.removeListener () kullanma
Herhangi bir zamanda belirli bir olay veya nesnedeki değişikliklerden artık haberdar olmak istemiyorsak, olayın türünü ve geri arama işlevini aşağıdaki gibi belirterek kaydı durdurabiliriz:
.once () kullanma
Uygulamamız en az bir kez olacak bir olayı dinliyorsa veya sadece bir kez gerçekleşmesini istiyorsak, kullanabiliriz. .onbir(), dinleyiciyi ekler ve ilk olay gerçekleştiğinde onu kaldırır:
.removeAllListeners () kullanma
Son olarak, belirli bir olay türü için tüm dinleyicileri bir olay yayıcıdan aşağıdaki gibi kaldırabiliriz:
yayıncı.removeAllListeners (tür);
Olay yayıcı oluşturma
Olay yayıcı, işlevler yerine olayları bağladığımız için arabirimler oluşturmanın genel bir yolunu sağlar, bu da deseni kullanmak istesek bile programımızı daha esnek hale getirir. Node.js Uygulamamız boyunca bir sözde sınıf oluşturabilir ve bundan miras alabiliriz. Olay Verici aşağıdaki gibi:
util = gerektirir ('util'); var EventEmitter = gerektirir ('events').EventEmitter; var Sınıfım = function () {} util.inherits (MyClass, EventEmitter);yöntemleri bu şekilde Olay Verici Bizim örneğimiz için mevcut olacaklar ve onları sorunsuz ve bu şekilde kullanabiliriz. Sınıfım olayları yayabilir:
MyClass.prototype.someMethod = function () {this.emit ("özel olay", "argüman 1", "argüman 2"); };Burada ne zaman bazı yöntem örneğinde denir Sınıfım, örnek adlı bir olay yayar özel etkinlik, burada sırasıyla olay dinleyicilerine gönderilecek olan argüman 1 ve argüman 2 olmak üzere iki farklı veri yayar. Son olarak şu durumlarda Sınıfım istemci tarafında dinleyebilirsiniz özel etkinlik aşağıdaki gibi:
var Sınıfım = new Sınıfım(); Sınıfım.on ('özel olay', işlev (str1, str2) {console.log ('Özel olay str1 s ve str2 s argümanlarıyla dinlendi!', Str1, str2;});Gördüğümüz gibi, olay yayıcı ile birlikte olayların kullanılması, uygulamamızla iletişim kurmamıza yardımcı oluyor ve bu öğreticiyi, asenkron programlamanın ötesine geçebildiğimiz ve standart ve optimal bir koruma sağlamamıza yardımcı olan uygulamaları bu şekilde sonlandırdık. desen. uygulamalarımız için.