eventEmitter侦听器和具有不同参数的发射器

nir*_*ack 8 javascript mocha.js node.js eventemitter protractor

我们可以有一个发射器的多个侦听器,每个都在不同数量的参数上工作吗?

例如,让事件发射器像这样:

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) {})
Run Code Online (Sandbox Code Playgroud)

如果以上是真的,那么哪个参数转到哪个监听器?

myn*_*iil 19

事件监听器只是常规的JS函数.因此,您可以根据需要传递任意数量的参数,但函数只能访问您在函数定义中声明的参数,即

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!');
Run Code Online (Sandbox Code Playgroud)

实际上你可以看到所有提供的参数总是传递给每个函数.但是如果你没有在函数声明中定义参数名,你将无法直接访问这些参数.但是你可以在每个函数中使用魔术"arguments"对象来访问所有提供的参数.当然,参数按照它们传递给EE的顺序提供给函数.


小智 5

EventEmitter似乎使用apply方法调用所有侦听器.因此,每个侦听器都可以期望以传递给emit函数的相同顺序接收参数.以下代码演示了无参数侦听器仍然接收函数的所有参数.

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');
Run Code Online (Sandbox Code Playgroud)