2015-09-10 2 views
1

Я храню слушатель событий внутри WeakMap и после извлечения функции, чтобы удалить его из EventEmitter брошенной Получить ошибки'S:TypeError: слушатель должен быть функцией

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

Что такое 'typeof listener' в' eventEmitterA.on ('close', ...) '? У вас есть 'console.log()', если typeof является функцией, но что там на самом деле? – jfriend00

+0

console.log (typeof прослушиватель) дает «функцию» – timw

+1

некоторые [docs] (https://nodejs.org/api/events.html#events_emitter_removelistener_event_listener) могут быть полезны – Hacketo

ответ

1
eventEmitterB.removeListener(listener); 

должен быть

eventEmitterB.removeListener('stuff', listener); 

removeListener принимает два аргумента, и функция должна быть вторым аргументом, поэтому вы передаете функцию как имя обработчика и undefined в качестве обработчика.

Смежные вопросы