Node.js - 监听器何时注册

Node.js - Listen for when listeners are registered

在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);
    };

我认为这会奏效,但我不确定。我认为这只会影响这个特定的事件发射器,而不是所有事件发射器,因为它不会改变原型...

您可以侦听 newListener 事件:

The EventEmitter instance will emit its own 'newListener' event before a listener is added to its internal array of listeners.

参见EventEmitter.newListener

要复制相同的行为,您应该创建一个新的 class/prototype,所有其他实例将从那里继承。

编辑:

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