我有一个与几个不同node.js模块交互的对象。
我希望其中一些模块能够将eventListeners添加到对象中。
我有一个events
文件,其中附加和删除了事件发射器。看起来基本上就像这个
function onData() {
if(!this._eventEmitter) this._eventEmitter = new EventEmitter();
this._eventEmitter.on('data', this._callback);
}
function removeOn() {
console.log(typeof this._callback, this._callback.name);
try {
this._eventEmitter.removeListener('data', this._callback.name);
} catch(e) {
console.log('err', e);
}
}
module.exports = {
on: onData,
off; removeOn
}
我只是通过
添加事件监听器var evt = require('./libs/events');
// a bunch of stuff
function fctName(){
console.log('this is the callback');
};
this._callback = fctName;
evt.on.call(this);
var self = this;
setTimeout(function(){
evt.off.call(self);
},3000);
on
方法在队列上完全触发。当我尝试使用off
方法删除侦听器时,控制台会显示function fctName
,表明this._callback
实际上是一个函数且名称已知。但try
失败,返回的错误为[TypeError: listener must be a function]
。
我认为问题可能是函数的范围不可用,但函数应该附加到传递的this
对象上。我有点想到这一点。
----------------更新----------------------------
我已删除removeListener中.name
的{{1}} @建议@bergi。我不再收到错误,但仍然没有删除监听器。
我也试过
this._callback
这两个都没有删除监听器。
this._eventEmitter.removeAllListeners('data');
this._eventEmitter.removeAllListeners();
的控制台输出是
this._eventEmitter
我可以清楚地看到我尝试删除的功能的 { domain: null,
_events: { data: [Function: fctName] },
_maxListeners: 10 }
和data
,但无法以任何方式将其删除。
答案 0 :(得分:2)
removeListener
期待回调本身,而不是name。只有第一个参数,即事件名称,应该是一个字符串,第二个参数应该是函数。
function removeOn() {
this._eventEmitter.removeListener('data', this._callback);
}