某个对象上的事件和侦听器是否充当该侦听器的“识别对”?或者只是对象上的事件?
在这里阅读node.js文档: http://nodejs.org/api/events.html#events_emitter_removelistener_event_listener
例如,如果您有两个回调函数listener_1
和listener_2
:
var stdin = process.stdin;
stdin.on('data',listener_1);
stdin.on('data',listener_2);
然后删除侦听器,使用:
stdin.removeListener('data',listener_1);
那么,listener_2
仍然在听吗?
谢谢。
PS。我尝试使用util.inspect
和listeners
方法测试自己,但仍然不自信我理解这是如何工作的!
答案 0 :(得分:5)
如果要删除所有侦听器,可以使用
stdin.removeAllListeners('data')
否则,在致电后
stdin.removeListener('data',listener_1);
listener_2 仍在侦听。
答案 1 :(得分:2)
你可以使用匿名函数,但你需要将它保存在某个地方。
var listener = function(){};
emitter.on('event', listener);
emitter.removeListener('event', listener);
但这意味着你不能使用bind或箭头函数闭包表示法:
emitter.on('event', listener.bind(this));// bind creates a new function every time
emitter.removeListener('event', listener.bind(this));// so this doesn't work
emitter.on('event', ()=>{});// closure creates a new function every time
哪个很烦人。这虽然有效:
emitter.on('event', this.eventListener = () => {});
emitter.removeListener('event', this.eventListener);
这样做(将监听器存储在地图中):
emitter.on('event', this.listeners['event'] = this.myEventListener.bind(this));
emitter.removeListener('event', this.listeners['event']);
这并不总是一个问题:
无论哪种方式,您都不需要指定该功能。但是,当你这样做时,你会这样做。