【问题标题】:One object doesn't listen to an event emitted on another object一个对象不监听另一个对象发出的事件
【发布时间】:2014-10-02 05:06:28
【问题描述】:

试图让一个对象发射和接收事件:

var events = require('events'),
    util   = require('util');

function Obj(){
  events.EventEmitter.call( this ); // what does this line?
}

util.inherits( Obj, events.EventEmitter );

var o = new Obj(),
    a = new Obj();

a.on('some', function () {
  console.log('a => some-thing happened');
});

o.on('some', function () {
  console.log('o => some-thing happened');
});

o.emit('some');

【问题讨论】:

  • 如果您要问两个单独的问题,我可以将第二个问题作为duplicate of this one...
  • 是的,找到了这个。是的

标签: javascript node.js events event-handling eventemitter


【解决方案1】:

只有来自同一个对象而不是另一个对象的响应o => some-thing happened。为什么?

因为它们是不同的发射器对象。每个发射器只通知自己的听众;这是一种观察者模式,而不是调解者模式。

以及如何让他们都听some事件?

仅使用一个 EventEmitter 实例。您甚至可能不需要 Obj 子类,只需使用 a = o = new EventEmitter()

events.EventEmitter.call( this ); 行是做什么的?对结果没有任何影响。

What is the difference between these two constructor patterns?

【讨论】:

  • Observer 意味着你正在监听一个特定的 observable - 你有两个,其中只有一个正在发出一个事件。中介者意味着你有一个全局对象,所有其他人都在监听和/或触发事件。
【解决方案2】:
  1. 它们是独立的事件发射对象,inherits() 唯一做的就是将子类的原型设置为父类的原型。子类并没有神奇地联系在一起。

  2. events.EventEmitter.call( this ); 执行父级的构造函数以允许其执行自己的一些初始化(例如,设置事件侦听器对象,该对象存储事件和其他属性的事件处理程序)。然后在events.EventEmitter.call( this ); 之后,您可以在此之上为您的子类执行自己的初始化。这通常包括特定于实例的属性(例如this.id = Math.random() * 1000);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 2015-02-19
    • 2018-02-13
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2012-05-13
    相关资源
    最近更新 更多