Прослушиватели и эмиттеры EventEmitter с разными параметрами

#javascript #node.js #mocha.js #protractor #eventemitter

#javascript #node.js #mocha.js #транспортир #eventemitter

Вопрос:

Можем ли мы иметь несколько слушателей эмиттера, каждый из которых работает с разным количеством аргументов?

например, пусть эмиттер события будет таким:

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

Если вышесказанное верно, то какой параметр переходит к какому слушателю?

Ответ №1:

Прослушиватели событий просто обычные функции 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!');
 

На самом деле вы можете видеть, что все предоставленные аргументы всегда передаются каждой функции. Но если вы не определяете имена аргументов в объявлении функции, вы не сможете напрямую обращаться к этим аргументам. Но вы можете использовать волшебный объект «аргументы» внутри каждой функции для доступа ко всем предоставленным аргументам. Конечно, аргументы, предоставленные функции в том порядке, в котором они были переданы EE.

Комментарии:

1. Понял. Таким образом, передаются все аргументы независимо от того, сколько аргументов содержится в объявлении функции. Если они не определены явно, они будут получены в объекте magic argument . Спасибо, люди

Ответ №2:

Похоже, что 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');
 

Комментарии:

1. Спасибо Хейсу за быстрый ответ