javascript - 类型错误 : listener must be a function

标签 javascript node.js eventemitter

我将事件监听器存储在 WeakMap 中,并在检索函数以将其从 EventEmitter 中删除时抛出此错误:

TypeError: listener must be a function

我就是不知道问题出在哪里:

var EventEmitter = require('events').EventEmitter;

var listeners = new WeakMap();
var eventEmitterA = new EventEmitter();
var eventEmitterB = new EventEmitter();

eventEmitterA.on('open', (obj) => {
  function stuff() { /* ... */ }

  listeners.set(obj, stuff);

  eventEmitterB.on('stuff', stuff);
});

eventEmitterA.on('close', (obj) => {
  var listener = listeners.get(obj);

  console.log(typeof listener); // logs "function"

  eventEmitterB.removeListener(listener);
});


var someObject = {some: 'object'};

eventEmitterA.emit('open', someObject);
eventEmitterA.emit('close', someObject);

最佳答案

eventEmitterB.removeListener(listener);

应该是

eventEmitterB.removeListener('stuff', listener);

removeListener 接受两个参数,并且该函数应该是第二个参数,因此您将函数作为处理程序的名称传递,并将 undefined 作为处理程序传递。

关于javascript - 类型错误 : listener must be a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32512313/

相关文章:

javascript - Node.js EventEmitter 无法立即发出

javascript - 防止重新渲染 react 对象数组

javascript - 缩放图像以最适合框架(div)的算法

javascript - 获取 playlistItems 的 viewCount,组合 HTTP 请求 youtube v3 + JQuery

node.js - 如何加速 MongoDB count() 查询?

jquery - 仅限 Chrome 中的超慢预检选项

c# - socket.io-client 足以作为 XSockets.NET 服务器的套接字客户端吗?

javascript - jquery Accordion 菜单默认在加载时关闭

angular - 当我在组件 A 中收到此函数的事件时,如何调用组件 B 中的函数

带有回调的 Angular @Output