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

时间:2014-06-25 17:18:12

标签: javascript node.js mocha protractor eventemitter

我们可以有多个发射器的侦听器,每个侦听器使用不同数量的参数吗?

e.g。 让事件发射器像这样:

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

如果上述情况属实,那么哪个参数转到哪个监听器?

2 个答案:

答案 0 :(得分:18)

事件监听器只是常规的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!');

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

答案 1 :(得分: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');