2014-06-25 26 views
7

Her biri farklı sayıda argüman üzerinde çalışan bir emitörün birden fazla dinleyicisine sahip olabilir miyiz?eventEmitter parametreleri ve farklı parametreleri olan emitörler

örn. olay yayıcı böyle olalım:

evetE.emit('pre', global, file, self); 
corresponding event listeners: 
//Listener 1 

m.eventE.on('pre', function() { 
//TODO 
}) 

//Listener 2 
eventE.on('pre', function(context, file, m){ 
    console.log(context.ans); 
}); 

//Listener 3 
eventE.on('pre', function(context){ 
    console.log(context.ans); 
}); 

//Listener 4 
this.eventE.on('pre',function (context) {}) 

yukarıda doğru ise, o zaman hangi parametrenin hangi dinleyici gider?

cevap

4

EventEmitter, apply yöntemini kullanarak tüm dinleyicileri çağırır gibi görünüyor. Bu nedenle, her dinleyici, emit işlevine geçirilen aynı sırayla bağımsız değişkenleri almayı bekleyebilir. Aşağıdaki kod, parametresiz dinleyicinin hala tüm argümanları işleve aldığını gösterir.

var EventEmitter = require('events').EventEmitter; 

var ee = new EventEmitter(); 

ee.on('myEvent', function() { 
    console.log('no arguments'); 
    console.log(arguments); // Outputs: { '0': 'arg 1', '1': 'arg 2' } 
}); 

ee.on('myEvent', function(arg1, arg2) { 
    console.log('with arguments'); 
    console.log(arg1); 
    console.log(arg2); 
}); 

ee.emit('myEvent', 'arg 1', 'arg 2'); 
+0

Hızlı yanıt için teşekkürler Hayes – nirvanastack

14

Olay dinleyicileri yalnızca normal JS işlevleri. istediğiniz kadar Yani birçok argüman geçebilir ancak işlevi yalnızca işlev tanımında ilan ettiler bu argümanları erişebilir yani

var EE = require('events').EventEmitter; 
var ee = new EE(); 

ee.on('test', function (first, second, third) { 
    console.log(first, second, third); //Will output full phrase 
}); 

ee.on('test', function (first) { 
    console.log(first); //Will output just first word 
}); 

ee.on('test', function() { 
    console.log.apply(console, arguments); //Will output full phrase again 
}); 

ee.emit('test', 'Hello', 'my', 'world!'); 

Aslında tüm sağlanan argümanlar her zaman her işleve geçirilen görebiliriz. Ancak, işlev beyanında argüman adlarını tanımlamazsanız, bu argümanlara doğrudan erişemezsiniz. Ancak, sağlanan tüm argümanlara erişmek için her işlev içindeki sihir "argümanları" nesnesini kullanabilirsiniz. Tabi ki, EE'ye iletildikleri sırayla işleve verilen argüman.

+0

Anladım. Böylece işlev argümanında ne kadar argüman olursa olsun tüm argümanlar iletilir. Açıkça tanımlanmamışsa, sihirli argüman nesnesinde alınacaktır. Teşekkürler insanlar – nirvanastack

+0

Bir şey değil! – mynameisdaniil