2014-06-25 14 views
7

Czy możemy mieć wielu słuchaczy emitera, z których każdy pracuje z inną liczbą argumentów?eventEmittery i nadajniki o różnych parametrach

np. niech wydarzenie emiter być tak:

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) {}) 

Jeśli powyższe jest prawdą, to parametr, który idzie do którego słuchacz?

Odpowiedz

4

EventEmitter wydaje się wywoływać wszystkie detektory przy użyciu metody apply. Dlatego każdy program nasłuchujący może oczekiwać otrzymania argumentów w tej samej kolejności przekazanej do funkcji emit. Poniższy kod pokazuje, że detektor bez parametrów wciąż otrzymuje wszystkie argumenty do funkcji.

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

Dzięki Hayes za szybką odpowiedź – nirvanastack

14

Detektory zdarzeń to zwykłe funkcje JS. Więc można przekazać jak najwięcej argumentów, ile chcesz, ale tylko funkcja może uzyskać dostęp do tych argumentów zostały zadeklarowane w definicji funkcji tj

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!'); 

Faktycznie widać, że wszystkie przewidziane argumenty zawsze przekazywane do każdej funkcji. Ale jeśli nie zdefiniujesz nazw argumentów w deklaracji funkcji, nie będziesz w stanie uzyskać bezpośredniego dostępu do tych argumentów. Ale możesz użyć magicznego "argumentu" obiektu wewnątrz każdej funkcji, aby uzyskać dostęp do wszystkich podanych argumentów. Oczywiście, argument dostarczony do funkcji w kolejności, w jakiej zostały przekazane do EE.

+0

Mam to. Wszystkie argumenty są przekazywane niezależnie od tego, ile argumentów znajduje się w deklaracji funkcji. Jeśli nie zostaną wyraźnie zdefiniowane, zostaną one odebrane w magicznym obiekcie argumentu. Dzięki ludziom – nirvanastack

+0

Nie ma za co! – mynameisdaniil