当`typeof`返回函数时,Node.js EventEmitter函数错误`listener必须是一个函数` - 可能是范围问题

时间:2015-09-08 10:26:03

标签: javascript node.js eventemitter

我有一个与几个不同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,但无法以任何方式将其删除。

1 个答案:

答案 0 :(得分:2)

removeListener期待回调本身,而不是name。只有第一个参数,即事件名称,应该是一个字符串,第二个参数应该是函数。

function removeOn() {
    this._eventEmitter.removeListener('data', this._callback);
}