我有一个对象的两个实例,这些对象扩展了EventEmitter并监听一个称为finish的事件。如果我在构造函数之外设置事件处理程序,则一切都会按预期进行。每个实例都听到它触发的finish的发生。但是,如果我在构造函数中设置事件处理程序,那么只有第二个创建的实例可以听到事件并对该事件使用react,似乎是这样。

这是代码:

var util = require('util');
var EventEmitter = require('events').EventEmitter;
var fs = require('fs');

var NEXT_ID = 0;
var MyEmitter = function() {
  EventEmitter.call(this);
  this.id = NEXT_ID;
  NEXT_ID++;
  console.log('CREATED EMITTER WITH ID:', this.id)
  self = this;
  this.on('finish', function() {
    console.log('FINISH EVENT . CONSTRUCTOR LISTENER .',
                'LISTENER ID:', self.id,
                '. ORIGINATOR ID:', this.id);
  });
};

util.inherits(MyEmitter, EventEmitter);

var setFinishListener = function(emitter) {
  emitter.on('finish', function() {
    console.log('FINISH EVENT . NON-CONSTRUCTOR LISTENER .',
                'LISTENER ID:', emitter.id,
                '. ORIGINATOR ID:', this.id);
  });
}

var emitter0 = new MyEmitter();
var emitter1 = new MyEmitter();

setFinishListener(emitter0);
setFinishListener(emitter1);

emitter0.emit('finish');
emitter1.emit('finish');

// The following is logged to the console:
// FINISH EVENT . CONSTRUCTOR LISTENER . LISTENER ID: 1 . ORIGINATOR ID: 0
// FINISH EVENT . NON-CONSTRUCTOR LISTENER . LISTENER ID: 0 . ORIGINATOR ID: 0
// FINISH EVENT . CONSTRUCTOR LISTENER . LISTENER ID: 1 . ORIGINATOR ID: 1
// FINISH EVENT . NON-CONSTRUCTOR LISTENER . LISTENER ID: 1 . ORIGINATOR ID: 1

请注意,在LISTENER ID的构造函数中设置的事件处理程序版本的MyEmitter始终属于第二个创建的实例,从而使该实例似乎总是首先捕获该事件,并且由于某种原因,第一个创建的实例从不捕获该事件。触发了该处理程序。

我假设我正确理解了两个事实:

事件处理程序中的
  • this应该始终是发出事件的对象。
  • 构造函数中的
  • this应该始终是构造函数要返回的对象(因为它是使用new调用的)。

  • 如果这两个都是正确的,我不知道还有什么我不理解,这会导致表现出来的行为。

    这让我想到了另外一件事:事件是否总是被发出该事件的同一EventEmitter所“听到”?这就是我的想法,当然这似乎是最常见的用例。但是,如果这不是一个限制,那么例如,按钮上的click事件如何不触发所有其他按钮的单击处理程序?

    最佳答案

    问题是您没有使用var self = this;self变量固定到Emitters范围。当您省略var时,Javascript将在范围内提升该变量,直到找到用var声明的匹配变量名为止。由于您从未声明过一个,因此self将一直托管到全局范围,因此将使用相同的引用创建每个发射器。

    添加var self = this将解决此问题。您还可以添加use strict来捕获此类问题,因为如果不使用var,将不允许您声明变量。

    10-07 19:38
    查看更多