Оскільки Node.js v6.0.0, новий class
оператор розповсюдження синтаксису та аргументу повністю підтримується, тому досить безпечно і досить просто реалізувати бажану функціональність за допомогою простого успадкування та заміни методу:
'use strict';
var EventEmitter = require('events');
class MyEmitter extends EventEmitter {
emit(type, ...args) {
super.emit('*', ...args);
return super.emit(type, ...args) || super.emit('', ...args);
}
}
Ця реалізація спирається на той факт, що вихідний emit
метод EventEmitter
повертається true
/ false
залежно від того, обробляв подію якийсь слухач чи ні. Зверніть увагу, що заміна включає return
твердження, тому ми зберігаємо таку поведінку для інших споживачів.
Тут ідея полягає у використанні події зірки ( *
) для створення обробників, які виконуються для кожної окремої події (скажімо, для реєстрації), а порожньої події ( ''
) - за замовчуванням або ловлять усі обробники, які виконуються, якщо ніщо інше не вловлює це подія.
Ми обов’язково викликаємо *
спочатку подію star ( ), оскільки у випадку error
подій без будь-яких обробників результат насправді є винятком. Щоб отримати докладнішу інформацію, погляньте на реалізаціюEventEmitter
.
Наприклад:
var emitter = new MyEmitter();
emitter.on('foo', () => console.log('foo event triggered'));
emitter.on('*', () => console.log('star event triggered'));
emitter.on('', () => console.log('catch all event triggered'));
emitter.emit('foo');
emitter.emit('bar');
Нарешті, якщо екземпляр EventEmitter вже існує, але ви хочете налаштувати цей конкретний екземпляр на нову поведінку, це можна легко зробити, виправивши метод під час виконання, як це:
emitter.emit = MyEmitter.prototype.emit;