Node.js için acemi, olaylar üzerinden geri aramalar kullanılarak kazanılan avantaj nedir?


24

Acemi bir JavaScripter'im ve V8 motorunun içinde neler olup bittiğiyle ilgili hiçbir bilgim yok.

Bunu söyledikten sonra, node.js ortamına ilk girişimlerimden gerçekten zevk alıyorum ancak programlarımın bir notifier-gözlemcisine uyacak şekilde yapılandırabilmem için, global olayları yaymanın bir aracı olarak sürekli events.EventEmitter () kullanıyorum yazdıklarıma benzer bir model bir Objective-C veya Python programı.

Kendimi hep böyle şeyler yaparken buluyorum:

var events = require('events');

var eventCenter = new events.EventEmitter();

eventCenter.on('init', function() {
    var greeting = 'Hello World!';
    console.log('We're in the init function!);
    eventCenter.emit('secondFunction', greeting);
});

eventCenter.on('secondFunction', function(greeting) {
        console.log('We're in the second function!);
        console.log(greeting);
    eventCenter.emit('nextFunction');
});

eventCenter.on('nextFunction', function {
    /* do stuff */
});

eventCenter.emit('init');

Bu yüzden aslında sadece "async" node.js kodunu beklediğim sırada iş yapan koda yapıyorum, bunun yerine bir tür "geriye doğru kodlama" yapıyorum. Bunu performans açısından ya da felsefe açısından geri arama ağırlıklı bir şekilde yapmanın herhangi bir farkı olur mu? Aynı şeyi olaylar yerine geri çağırmaları kullanarak yapmak daha mı iyidir?


Kodunuzun okunabilirliğini yoğun geri arama kullanımından dolayı sıkıntı yaşarsanız, geri arama kullanımınızı sarmak için bir çerçeve kullanmayı düşünün. Biraz ayarlama gerektiriyor, ancak sözler çoğu zaman çirkin geri aramaları çözebilir. JQuery kullanıyorsanız, Deferred'i kullanabilirsiniz . En basit söz çerçevelerinden biri RSVP'dir .
Brian

Kafam karıştı, kodunuzda zaman uyumsuz bir şey görmüyorum, sadece karmaşık bir şekilde yazılmış işlev çağrıları.
svick

Yanıtlar:


27

Geri aramalarla ilgili güzel şey, burada küresel bir durum olmaması ve bunlara parametrelerin iletilmesi önemsiz. Eğer bir işleve download(URL, callback: (FileData)->void)sahipseniz, bunun temelde bir "bunu al ve yap" işlevini oluşturmanıza izin veren bağımsız bir üst düzey işlev olduğunu anlayabilirsiniz. Kod akışınızın tam beklediğiniz gibi olduğundan emin olabilirsiniz, çünkü başka hiç kimsenin bu geri çağırma işini bile tutamaz ve bu geri çağırma işlevi üst işlevin verdiği parametreler dışında hiçbir şey bilmez. Bu modüler ve test edilmesi kolaydır.

Şimdi paralel olarak 5 dosya indirmek ve farklı şeyler yapmak istiyorsanız, uygun geri çağırma işlevleriyle bu işlevlerin yalnızca beşini başlatmanız gerekir. Anonim işlev sözdiziminin iyi olduğu bir dilde bu inanılmaz güçlü olabilir.

Öte yandan, etkinlikler, 1..*bazı devlet değişikliklerini kullanıcılara bildirmek için daha fazla tasarlanmıştır . Verileri nerede bulacağını bilen , sonunda "download complete" etkinliğini download(URL)başlatırsanız processDownload(), uygulamalarınızı daha büyük bir duruma getirirsiniz. İndirmeleri şimdi nasıl paralel hale getiriyorsunuz? Farklı indirmeleri farklı şekilde nasıl ele alıyorsunuz? Mı download(URL, eventId)zarif? Mı downloadAndDoThing(URL)zarif? Zorlukla.

Tabii ki, her şeyde olduğu gibi, haksızlıklar yapıyorsunuz. İçiçe geri aramaları kod yürütülmesine daha kafa karıştırıcı sırasını yapabilir ve kolay küresel Erişebilirlik olmaması o herhangi bir şey için kötü bir seçim yapar yapmak bir var 1..*üretici ve tüketici arasındaki ilişkiyi. Verileri dolaştırmakta zorlanıyorsunuz, ancak ek bir duruma sahip olmamaktan kurtulabiliyorsanız, bu genellikle bir faydadır.

Ne olursa olsun. Geri aramaların aptalca olduğu node.js kodunu kullanıyorsunuz ve dil ve kitaplıklar kullanımları için tasarlandı. İster bir tasarımda ister başka bir alanda avantajlar görseniz de, deyimsel kod yazmanın herhangi bir dilde çok daha büyük bir desteğe sahip olacağı ve hayatınızı atlatmaya çalışmaktan daha kolay hale getireceği neredeyse her zaman doğru olduğunu düşünüyorum.


2

NodeJS’deki olayları hiç kullanmadım, ancak genel olarak müşteride JS olaylarını kullandığım şey, bir SPA görünümünün farklı bölümlerinin buna tepki gösterebilmesi için (örneğin bir zaman çizelgesinde göster, yükle bir panelde, vb.)
Ancak bir yöntemin tamamlandığını bildirmek için olayları kullanmak seyahat etmek tehlikeli bir yol olabilir. Atıldıkları sıraya göre gelen olaylara güvenemezsiniz, böylece her türlü rastlantısallığa yol açabilir ...
Olayları kullanırken yanlış bir şey yoktur, ancak altında gitmemeniz gereken belirli bir ayrıntı düzeyi vardır. ; domain-ish olaylarına sadık kalırsanız sorun değil. Ancak yöntemlerin bittiğini bildirmek çok ayrıntılı.


0

Keşfetebileceğiniz bir şey, olayları nesnenin dışına yayan nesnenin dışında kullanmaktır. Örnekte, eventCenterkendi olaylarını hem yayıyor hem de ele alıyor gibi görünüyor. Diğer nesneler olayları ele almaya başlarsa uygulamanızın yapısının nasıl değişebileceğini düşünün.

Bu nedenle, eventCenterbaşka nesnelerin başlangıç ​​kodlarını vb. Yapmak için kullanabileceği "init" ifadesini yayınlayabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.