我应该何时使用多个事件名称与不同的事件发射器?

时间:2015-04-30 14:42:04

标签: javascript node.js javascript-events

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

A)

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

我想知道两者之间是否存在任何差异,表现明智或任何差异......

2 个答案:

答案 0 :(得分:1)

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

如您所知,这两种变体都有效,所以这只是一个偏好问题。对象隐藏了复杂性,应该使用事件来记住这个想法。在你的例子中,我认为使用一个 house 对象是完全没问题的,该对象会发出事件来打开灯光并敲响门铃。

正如您可能预见的那样,事件的添加将会变得混乱。因此,您必须自己决定某个事件是否属于特定对象范围的边界。

答案 1 :(得分:-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!");
});