javascript - 当 `listener must be a function` 返回函数时,Node.js EventEmitter 函数错误 `typeof` - 可能是范围问题

标签 javascript node.js eventemitter

我有一个对象正在与几个不同的 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 }

我可以清楚地看到我尝试删除的函数的 datafctName,但无法以任何方式删除它。

最佳答案

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/

相关文章:

javascript - 线的空间索引

javascript - 在 Rails 中,如何获取具有动态创建的 ID 的元素?

javascript - Bootstrap 4 下拉菜单未显示

javascript - 异步回调不可能嵌套

javascript - 无论如何,Node.js 中的 Express 可以有多个静态文件夹吗?

node.js - 合并NodeJS流时如何调用 `setMaxListeners`

javascript - 使用 JavaScript 和警报禁用 HTML 链接

node.js - ElasticSearch:ignore_malformed 不工作

node.js - 从对象发出事件

node.js - 用 Jest 模拟自定义事件发射器