#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. Спасибо Хейсу за быстрый ответ