2016-04-13 20 views
0

fonksiyon kodu (source code on github): Bu doğrultudanodejs/events.js 'emitMany işlevindeki dinleyici dizisinin klonlanmasının nedeni nedir?

function emitMany(handler, isFn, self, args) { 
    if (isFn) 
    handler.apply(self, args); 
    else { 
    var len = handler.length; 
    var listeners = arrayClone(handler, len); 
    for (var i = 0; i < len; ++i) 
     listeners[i].apply(self, args); 
    } 
} 

: handler Bu kapsamda adlandırılan dinleyici bir dizi klonlanmış ve daha sonra da klon atanan

var listeners = arrayClone(handler, len); 

listeners adlı yeni değişken. Bunun ne işe yaradığını merak ediyorum.

Bir dinleyicinin kendisini listeden kaldırabileceğinden şüpheleniyorum ve bu işlem for döngüsünü sayaçta bozacaktır (liste öğelerinin dizinleri kaldırıldıktan sonra değişecektir, ancak sayaç i körü körüne devam etmeyecektir.) o.

Açıklamam doğru mu, yoksa başka bir şey mi var?

cevap

1

. 'Bar' olayı bu şekilde işleyicileri dizi işleyicileri çalıştırmadan önce klonlanabilir gerekir, ilk kez ateşlendiğinde

foo.on('bar', function() { 
    foo.on('bar', function() { // should not be invoked now/but for the next and subsequent events 
    }) 
}) 

ikinci işleyici

adı olmamalıdır.

1

Bu davranış genel olarak emit() (sadece dahili emitAny()) içindir ve bir olay işleyicisi Sınırsız kapasite döngü neden olabilir aynı olaya (veya benzeri durumlar) için bir olay işleyicisi olarak kendini ekler en azından önlemek durumlara var tek bir emit(). Örneğin:

ilgili olay yayılan zaman, işleyici ve böylece tekrarlanır dizi modifiye çok etkinlik için işleyicileri ekleme/kaldırma çünkü bu
emitter.on('foo', function fooHandler() { 
    emitter.on('foo', fooHandler); 
}); 
İlgili konular