如何删除同一对象上同时侦听同一事件的不同侦听器?

时间:2013-05-05 17:41:46

标签: node.js listener

某个对象上的事件侦听器是否充当该侦听器的“识别对”?或者只是对象上的事件

在这里阅读node.js文档: http://nodejs.org/api/events.html#events_emitter_removelistener_event_listener

例如,如果您有两个回调函数listener_1listener_2

var stdin = process.stdin;

stdin.on('data',listener_1);
stdin.on('data',listener_2);

然后删除侦听器,使用:

stdin.removeListener('data',listener_1);

那么,listener_2仍然在听吗?

谢谢。

PS。我尝试使用util.inspectlisteners方法测试自己,但仍然不自信我理解这是如何工作的!

2 个答案:

答案 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']);

这并不总是一个问题:

  • 在最常见的情况下,只有一个听众。
  • 在第二种最常见的情况下,可能有多个,但它们都想要一起移除(例如,因为发射器已完成其工作)。

无论哪种方式,您都不需要指定该功能。但是,当你这样做时,你会这样做。