我有一个对象正在与几个不同的 Node.js 模块进行交互。
我希望其中一些模块能够将事件监听器添加到对象中。
我有一个 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
对象。我对此有点束手无策。
---------------- 更新----------------------------------------
我已经按照@bergi的建议从removeListener中的this._callback
中删除了.name
。我不再收到错误,但监听器仍然没有被删除。
我也尝试过
this._eventEmitter.removeAllListeners('data');
this._eventEmitter.removeAllListeners();
两者都没有删除监听器。
this._eventEmitter
的控制台输出为
{ domain: null,
_events: { data: [Function: fctName] },
_maxListeners: 10 }
我可以清楚地看到我尝试删除的函数的 data
和 fctName
,但无法以任何方式删除它。
最佳答案
removeListener
需要回调本身,而不是 name 。只有第一个参数(事件名称)应该是字符串,第二个参数应该是函数。
function removeOn() {
this._eventEmitter.removeListener('data', this._callback);
}
关于javascript - 当 `listener must be a function` 返回函数时,Node.js EventEmitter 函数错误 `typeof` - 可能是范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32455306/