我对Node.js中的events.EventEmitter
有疑问,为什么要使用它?与示例1和示例2有什么区别?我发现它们相同,是吗?什么时候可以使用它?
let events = require("events");
let util = require("util");
let eventEmitter = new events.EventEmitter();
示例1包含EventEmitter
:
let Student = function(name) {
this.name = name;
}
util.inherits(Student, events.EventEmitter);
let student_max = new Student('max');
student_max.on('scored', function(points) {
if (points > 90) {
points = points + ' wow you scored more than 90'
}
console.log(`${this.name} ${points} points`);
})
student_max.emit('scored',95);
没有EventEmitter
let Student2 = function(name) {
this.name = name;
this.score = function(str,points) {
if (str!=='scored') {
return;
}
if (points > 90) {
points = points + ' wow you scored more than 90'
}
console.log(`${this.name} ${points} points`);
}
}
let student_lenny = new Student2('Lenny');
student_lenny.score('scored',95);
答案 0 :(得分:4)
第一个示例是事件发射器的子类,然后使用该事件发射器来实现某些功能。这意味着其他任何人都可以使用您的student_max
个对象之一并为scored
消息注册事件监听器,或者他们甚至可以自己发出scored
个消息。然后,您可以非常轻松地使用eventEmitter
功能扩展到对象中发生的其他事件,然后任何第三方也可以观察或触发这些事件。 eventEmitter
是公开基于事件的功能的标准化方式。您可以通过设计自己的通知方案来完成eventEmitter
的事情,但通常最好建立一个许多开发人员已经知道并且内置了大量功能的标准方案。
您当前编码的第二个示例完成了同样的事情,但不是可扩展的。例如,如果您想了解score
发生的任何事情,则必须对该对象进行子类化并覆盖score方法,而不是仅使用完善的eventEmitter
接口向事件添加侦听器。如果你没有自己创建对象(这使得很难进行子类化),那么你必须对score
方法进行修补以便观察它。
example1与example2
的区别是什么
这是一种架构差异,它会影响外部代理与这些对象的交互方式以及它们将来的可扩展性。
在example1中使用eventEmitter
是非常可扩展的,可以使用eventEmitter
功能轻松地将未来事件添加到对象,或者使用标准化界面监视或触发事件的外部代理。因此,差异并不在于您展示的代码到底是什么,而是它的架构方式,以及未来的可扩展性或外部代码如何与您的对象交互
何时使用它?
如果您希望外部各方能够以轻量级和简单的方式观察事件或触发对象上的事件,您可以考虑使用eventEmitter
对象。它是一个预先构建的系统,通常比发明自己的回调通知方案更好。有时,当您不尝试启用外部交互时,它甚至对您自己的实现也很有用。