覆盖节点 eventEmitter.on 并关闭日志记录不起作用

Overriding node eventEmitter.on with closure for logging not working

我正在尝试追踪我的 SPA 中的一个事件被触发次数过多的问题。考虑到这一点,我想覆盖节点的 eventEmitter.on 函数来添加一些登录然后调用原始的。这导致我在 SO 上找到关于覆盖 window.alert 的答案,我想出了以下代码:

// Ignore `state` here but it essentially means I can access `eventEmitter` all over my app.
var EventEmitter = ('events')   
state.eventEmitter = new EventEmitter()
state.eventEmitter.on = (function (original) {
    return function (name, callback) {
        console.log('On Called for %s', name)
        original(name, callback)
    }
})(state.eventEmitter.on)

这是行不通的。该事件根本没有触发,我在控制台中也没有看到任何内容。

我做错了什么?

注意:我还有其他方法可以追踪我的原始问题,但我很想知道为什么我上面的代码不起作用。

我试过你的代码,它大部分看起来不错,但当我 运行 它时,我收到以下错误:

Cannot read property '_events' of undefined EventEmitter 内部错误

这是因为您传递原始 .on() 函数的方式会在调用时丢失上下文(此参数)。

为避免这种情况,通过调用 state.eventEmitter.on.bind(state.eventEmitter) 将函数绑定到事件发射器。我还注意到您忘记了 return 原始函数的结果,因为 on() 是可链接的。

此外,如果没有人在监听事件,您覆盖的函数也不会被调用。

这是经过上述修改的代码

var EventEmitter = require('events');
state.eventEmitter = new EventEmitter();
state.eventEmitter.on = (function (original) {
    return function (name, callback) {
        console.log('On Called for %s', name);
            return original(name, callback);
        }
})(state.eventEmitter.on.bind(state.eventEmitter));

state.eventEmitter.on('my_event', function () {
    console.log('my_event has been called');
});

state.eventEmitter.emit('my_event');

得到以下输出:

On Called for my_event
my_event has been called