2

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

在此处阅读 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还在听吗?

谢谢你。

附言。我尝试使用util.inspectandlisteners方法测试自己,但仍然不确定我理解它是如何工作的!

4

2 回答 2

9

如果要删除所有侦听器,可以使用

stdin.removeAllListeners('data')

否则,调用后

stdin.removeListener('data',listener_1);

listener_2仍在听。

于 2013-05-05T17:57:36.463 回答
4

可以使用匿名函数,但需要将其保存在某处。

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

这并不总是一个问题:

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

无论哪种方式,您都不需要指定函数。但是,当您这样做时,您会这样做。

于 2015-07-12T08:16:04.510 回答