覆盖节点 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
我正在尝试追踪我的 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