【问题标题】:TypeError: listener must be a functionTypeError:监听器必须是一个函数
【发布时间】:2025-12-17 09:30:01
【问题描述】:

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

TypeError:监听器必须是函数

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

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);

【问题讨论】:

  • eventEmitterA.on('close', ...) 中的typeof listener 是什么?如果 typeof 是函数,你有一个 console.log(),但它实际上是什么?
  • console.log(typeof listener) 产生“函数”
  • 一些docs 可能会有所帮助

标签: javascript node.js eventemitter


【解决方案1】:
eventEmitterB.removeListener(listener);

应该是

eventEmitterB.removeListener('stuff', listener);

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

【讨论】: