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

Javascript 具有不同参数的eventEmitter侦听器和发射器,javascript,node.js,mocha.js,protractor,eventemitter,Javascript,Node.js,Mocha.js,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(con

一个发射器可以有多个侦听器,每个侦听器处理不同数量的参数吗

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

如果上述为真,那么哪个参数将转到哪个侦听器?

EventEmitter将使用该方法调用所有侦听器。因此,每个侦听器都可以期望以相同的顺序接收传递给
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');

事件侦听器只是普通的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的顺序提供给函数的。

明白了。因此,无论函数声明中有多少个参数,都会传递所有参数。如果没有明确定义,它们将在magic argument对象中接收。谢谢大家谢谢海斯的快速反应