2016-12-24 2 views
1

Я пытаюсь понять некоторый фрагмент кода из одного проекта с открытым исходным кодом, где я не понимаю, что означает позвонить EventEmitter.emit со звездочкой '*' как событие имя.NodeJS EventEmitter: использовать имя события как «*» (звездочка)

В некоторых библиотеках (например, JQuery) '*' в качестве имени события означает «все события».

Что это означает в контексте EventEmitter?

Я попытался найти слушателя для события '*' в этом проекте, но не повезло.

class BlaBla extends EventEmitter { 

    methodCall(event){ 
     this.emit("*", {event}); // <- what does this mean ??? 
    } 
} 
+0

Вы можете разместить ссылку на проект? – nem035

+0

@ nem035 - спасибо за помощь! Ссылка проекта - github.com/liangzeng/cqrs –

ответ

0

this.emit("*", {event}); означает, что вызов метода Emit() будет выполнять все функции, которые зарегистрированы с по методу.

+0

Глядя на [код] (https://github.com/nodejs/node/blob/master/lib/events.js#L136) и запуская его в REPL, показано, что это не так. – nem035

0

Использование '*' в качестве имени события не имеет специальных эффектов, оно ведет себя как нормальное событие.

Вы можете посмотреть на event emitter code и видеть, что только названия специального события являются:

  • 'error' - испускается, когда возникает ошибка
  • 'newListener' - испускается, когда новые слушатели добавляют
  • 'removeListener' - выбрасывается при удалении существующих слушателей

Пример (repl.it code)

const { 
    EventEmitter 
} = require('events'); 

class BlaBla extends EventEmitter { 

    methodCall(stuff) { 
    this.emit("*", { 
     stuff // <-- this gets passed as an argument to the handler for the '*' event 
    }); 
    } 
} 

const b = new BlaBla(); 

b.on('a', (...args) => console.log('nope', ...args)); // <-- this doesn't run 
b.on('b', (...args) => console.log('nope', ...args)); // <-- this doesn't run 
b.on('*', (...args) => console.log('this gets called', ...args)); // <-- This runs 

b.methodCall('this gets passed down'); 

Выход

this gets called { stuff: 'this gets passed down' } 

Если в данном проекте все обработчики событий вызываются, когда this.emit('*') называется, они, вероятно, делать это вручную.

Вот упрощенный пример того, как это можно сделать:

const eventNames = ['a', 'b', 'c']; 

this.on('*',() => 
    eventNames.forEach(event => this.emit(event)) 
); 
Смежные вопросы