Dav*_*071 6 node.js eventemitter
我有一个关于events.EventEmitterNode.js的问题,为什么要使用它?示例1和示例2有什么区别?我发现它们完全相同,是吗?什么时候可以使用它?
let events = require("events");
let util = require("util");
let eventEmitter = new events.EventEmitter();
Run Code Online (Sandbox Code Playgroud)
示例 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);
Run Code Online (Sandbox Code Playgroud)
示例 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);
Run Code Online (Sandbox Code Playgroud)
第一个示例子类化一个事件发射器,然后使用该事件发射器来实现一些功能。这意味着其他任何人都可以获取您的一个student_max对象并为该scored消息注册一个事件侦听器,或者他们甚至可以scored自己发出一条消息。然后,您可以非常轻松地使用该eventEmitter功能扩展到您的对象中发生的其他事件,然后任何第三方也可以观察或触发这些事件。eventEmitter是公开基于事件的功能的标准化方式。您可以eventEmitter通过设计自己的通知方案来完成任务,但通常最好建立在许多开发人员已经知道并且已经内置了大量功能的标准方案上。
您当前编码的第二个示例完成了同样的事情,但没有那么可扩展。例如,如果您想知道score发生的任何事情,您必须对对象进行子类化并覆盖 score 方法,而不仅仅是使用完善的eventEmitter接口向事件添加侦听器。如果您没有自己创建对象(这使得子类化变得困难),那么您必须对score方法进行猴子补丁以观察它。
示例 1 和示例 2 的区别是什么
这是一种架构差异,它影响外部代理与这些对象的交互方式以及它们在未来的可扩展性。
eventEmitter在 example1 中的使用是非常可扩展的,并且可以很容易地使用这些eventEmitter功能将未来的事件添加到对象中,或者让外部代理使用标准化的接口来监视或触发事件。因此,区别不在于您展示的代码究竟实现了什么,而在于它的架构方式以及未来的可扩展性或外部代码如何与您的对象进行交互
什么时候可以使用它?
您eventEmitter几乎可以在任何时候希望外部各方能够以轻量级和简单的方式观察事件或触发对象上的事件时考虑使用对象。这是一个预先构建的系统,通常比发明自己的回调通知方案更好。有时,当您不尝试启用外部交互时,它甚至对于您自己的实现也很有用。