【问题标题】:When should I use multiple event names vs different event emitters?什么时候应该使用多个事件名称和不同的事件发射器?
【发布时间】:2015-07-10 07:59:32
【问题描述】:

使用事件的更好方法是什么?

一)

var doorBell = new events.EventEmitter()
var light = new events.EventEmitter()

doorBell.emit('open')
light.emit('on')
doorBell.on('open', function(){
    console.log('The door is open!');
});
light.on('on', function(){
    console.log('The lights are on');
});

B)

var house = new events.EventEmitter()

house.emit('doorOpen')
house.emit('lightOn')
house.on('doorOpen', function(){
  console.log('The door is open!');
});
house.on('lightOn', function(){
  console.log('The lights are on');
});

我想知道两者之间是否有任何区别,无论是性能方面还是真正的区别......

【问题讨论】:

  • 我很确定 emitt 应该是 emit...
  • 对,但不是真正的问题,我猜还是谢谢^^

标签: javascript node.js javascript-events


【解决方案1】:

都没有。

尽管您可以使用这样的事件发射器,但这并不是您应该使用它们的方式。

你的类的原型应该扩展事件发射器的原型,然后从你的类创建的对象可以发射事件,你可以监听它们。

像这样使用事件发射器要直观得多:

var em = require('events').EventEmitter;
var House = function() { };

//House objects now emits events
House.prototype = em.prototype;

House.prototype.openDoor = function() { 
   this.emit('door opened');
};

House.prototype.turnOnLight = function() { 
    this.emit('light turned on');
};

var myHouse = new House();
myHouse.on('door opened',function() { 
   console.log("somebody's in my house!");
});

【讨论】:

  • 我认为任何类的原型都不应该是事件发射器实例。我按门铃,你家的门就开了?
  • @Bergi - 哇,我犯了大错。编辑。
【解决方案2】:

我有点不喜欢给出这个答案,但我想说这取决于

如您所知,这两种变体都有效,所以这只是一个偏好问题。对象隐藏了复杂性,在使用事件时应牢记这一点。在您的示例中,我认为使用一个 house 对象会非常好,该对象会发出事件来打开灯和敲响门铃。

正如您可能预见的那样,添加事件会在某个时刻变得混乱。所以你必须自己决定某个事件是否属于某个对象的范围的边界在哪里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2021-01-12
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多