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

Posted

技术标签:

【中文标题】覆盖节点 eventEmitter.on 并关闭日志记录不起作用【英文标题】:Overriding node eventEmitter.on with closure for logging not working 【发布时间】:2017-11-01 13:58:42 【问题描述】:

我正在尝试在我的 SPA 中查找一个事件被触发太多次的问题。考虑到这一点,我想覆盖节点的eventEmitter.on 函数来添加一些登录然后调用原始的。这让我在 SO https://***.com/a/10427757/261682 上找到了关于覆盖 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)

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

我做错了什么?

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

【问题讨论】:

【参考方案1】:

我尝试了您的代码,它看起来大部分都很好,但在我运行它时出现以下错误:

Cannot read property '_events' of undefinedEventEmitter的内部错误

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

为了避免这种情况,通过调用state.eventEmitter.on.bind(state.eventEmitter) 将函数绑定到事件发射器。我还注意到您忘记了返回原始函数的结果,因为 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

【讨论】:

太棒了!这有助于解决我的问题,我还希望在原始函数绑定完成后调用一些自定义函数!

以上是关于覆盖节点 eventEmitter.on 并关闭日志记录不起作用的主要内容,如果未能解决你的问题,请参考以下文章

nodejs 事件EventEmitter

node.js从入门到放弃

覆盖窗口关闭行为

为啥我的类节点会覆盖自己而不是创建新的节点对象

覆盖文件实际上会覆盖它吗? [关闭]

2018年4月12日--python