Node.js, EventEmitter 为何使用它
Node.js, EventEmitter of why using it
我对 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);
示例 2 没有 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);
第一个示例对事件发射器进行子类化,然后使用该事件发射器实现某些功能。这意味着任何其他人都可以获取您的 student_max
对象之一并为 scored
消息注册事件侦听器,或者他们甚至可以自己发出 scored
消息。然后,您可以非常轻松地使用 eventEmitter
功能扩展到对象中发生的其他事件,然后任何第三方也可以观察或触发这些事件。 eventEmitter
是公开基于事件的功能的标准化方式。您可以通过设计自己的通知方案来完成 eventEmitter
的工作,但通常最好建立在许多开发人员已经知道并且已经内置大量功能的标准方案之上。
您当前编码的第二个示例完成了同样的事情,但不是可扩展的。例如,如果您想知道 score
发生的任何事情,您将必须子类化对象并重写 score 方法,而不是仅仅使用完善的 eventEmitter
接口向事件添加侦听器。如果你没有自己创建对象(这使得很难子类化),那么你必须猴子修补 score
方法才能观察它。
what is the difference of the example1 to example2
这是一种体系结构差异,既会影响外部代理与这些对象的交互方式,也会影响它们在未来的可扩展性。
example1 中 eventEmitter
的使用具有很强的可扩展性,可以很容易地使用 eventEmitter
功能将未来事件添加到对象中,或者让外部代理使用标准化来监视或触发事件界面。因此,不同之处不在于您展示的代码究竟实现了什么,而在于它的架构方式以及未来的可扩展性或外部代码如何与您的对象交互
When is it practical to use it?
您几乎可以在任何时候考虑使用 eventEmitter
对象,只要您希望外部各方能够以轻量级和简单的方式观察事件或触发对象上的事件。这是一个预建的系统,通常比发明自己的回调通知方案要好。有时,当您不尝试启用外部交互时,它甚至对您自己的实施也很有用。
我对 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);
示例 2 没有 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);
第一个示例对事件发射器进行子类化,然后使用该事件发射器实现某些功能。这意味着任何其他人都可以获取您的 student_max
对象之一并为 scored
消息注册事件侦听器,或者他们甚至可以自己发出 scored
消息。然后,您可以非常轻松地使用 eventEmitter
功能扩展到对象中发生的其他事件,然后任何第三方也可以观察或触发这些事件。 eventEmitter
是公开基于事件的功能的标准化方式。您可以通过设计自己的通知方案来完成 eventEmitter
的工作,但通常最好建立在许多开发人员已经知道并且已经内置大量功能的标准方案之上。
您当前编码的第二个示例完成了同样的事情,但不是可扩展的。例如,如果您想知道 score
发生的任何事情,您将必须子类化对象并重写 score 方法,而不是仅仅使用完善的 eventEmitter
接口向事件添加侦听器。如果你没有自己创建对象(这使得很难子类化),那么你必须猴子修补 score
方法才能观察它。
what is the difference of the example1 to example2
这是一种体系结构差异,既会影响外部代理与这些对象的交互方式,也会影响它们在未来的可扩展性。
example1 中 eventEmitter
的使用具有很强的可扩展性,可以很容易地使用 eventEmitter
功能将未来事件添加到对象中,或者让外部代理使用标准化来监视或触发事件界面。因此,不同之处不在于您展示的代码究竟实现了什么,而在于它的架构方式以及未来的可扩展性或外部代码如何与您的对象交互
When is it practical to use it?
您几乎可以在任何时候考虑使用 eventEmitter
对象,只要您希望外部各方能够以轻量级和简单的方式观察事件或触发对象上的事件。这是一个预建的系统,通常比发明自己的回调通知方案要好。有时,当您不尝试启用外部交互时,它甚至对您自己的实施也很有用。