Olivenbaum
Olivenbaum

Reputation: 1006

TypeError: listener must be a function

I'm storing an event listener inside a WeakMap and upon retrieving the function to remove it from the EventEmitter this error get's thrown:

TypeError: listener must be a function

I just can't figure out what the problem is:

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

Upvotes: 2

Views: 12962

Answers (1)

loganfsmyth
loganfsmyth

Reputation: 161447

eventEmitterB.removeListener(listener);

should be

eventEmitterB.removeListener('stuff', listener);

removeListener takes two arguments and the function is supposed to be the second argument, so you are passing the function as the name of the handler and undefined as the handler.

Upvotes: 3

Related Questions