Node.js — слушайте, когда слушатели зарегистрированы

В Node.js у нас есть стандартный эмиттер событий:

const EE = require('events');

const ee = new EE();

ee.on('x', function(){

});

то, что я хотел бы сделать, это слушать, когда клиент регистрирует слушателя. Цель состоит в том, что если эмитент находится в определенном состоянии, он предпримет действия при регистрации.

Чтобы было ясно, когда вызывается ee.on(), для определенного события «x», я хочу предпринять некоторые действия.

Как я могу сделать это без исправления всех эмиттеров событий в Node.js?

Если я сделаю следующее, исправляю ли я метод прототипа или метод экземпляра?

let on = ee.on;

ee.on = function(){
    if(ee.y === true){
      process.next(function(){
        ee.emit('done');
      });
    }
    return on.apply(ee, arguments);
};

это, конечно, то же самое, что и:

   let on = ee.on;

    ee.on = function(){
        if(this.y === true){
          process.next(() => {
            this.emit('done');
          });
        }
       return on.apply(this, arguments);
    };

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


person Alexander Mills    schedule 10.04.2017    source источник


Ответы (2)


Чтобы воспроизвести одно и то же поведение, вы должны создать новый класс/прототип, от которого будут наследоваться все остальные экземпляры.

РЕДАКТИРОВАТЬ:

<file_my_class.js>:
var   Util = require('util');
const EventEmmiter = require('events');

// private data goes here
...

// public data follows
module.exports = MyClass;

function MyClass() {
...
}

Util.inherits (MyClass, EventEmmiter);

MyClass.prototype.mymethod = function () {
    someobj.on('somevent', () => {
        ...
        if (test_condition_ok) {
           this.emit ('myeventname');
        }
    });
}

<main.js>:

var MyClass = require('./file_my_class.js');
var myclass_instance = new MyClass();

myclass_instance.mymethod();

myclass_instance.on('myeventname', () => {
      // Do Something
   });
person José Fonte    schedule 10.04.2017
comment
@AlexanderMills Проверьте правку выше. Очистить или нужны дополнительные данные? - person José Fonte; 11.04.2017

Вы можете прослушать событие newListener:

Экземпляр EventEmitter будет генерировать собственное событие newListener до того, как слушатель будет добавлен к его внутреннему массиву слушателей.

См. EventEmitter.newListener.

person Alex Taylor    schedule 10.04.2017