Nodejs EventEmitter.once()如何工作?

gab*_*eno 5 javascript node.js

从nodejs 源代码(LOC 179),我们有以下内容:

EventEmitter.prototype.once = function(type, listener) {

  /** ... **/

  function g() { /** ... **/ }

  g.listener = listener; // => ???
  this.on(type, g);

  return this;
};
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的想法是这样的:

EventEmitter.once()设置一个事件typelistener在通过调用回调后立即将其删除g().但这条生产线究竟做了g.listener = listener;什么呢?

它是否在调用时添加了一个属性listener,该属性是构造函数创建的函数对象的函数g()

Lau*_*rin 8

它被设置为以后可以调用removeListener.

如果您调用this.once(event, listener)并稍后调用this.removeListener(listener),则代码将无法listener在列表中找到,因为它包含在内部g.

这就是L214测试的原因:

 if (list === listener ||
      (util.isFunction(list.listener) && list.listener === listener)) {
Run Code Online (Sandbox Code Playgroud)