Node.js、EventEmitter 为什么使用它

2024-05-01

我有一个问题events.EventEmitter在 Node.js 中,为什么使用它?示例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方法来观察它。

示例 1 与示例 2 有什么区别

这是一种架构差异,会影响外部代理与这些对象的交互方式以及它们未来的可扩展性。

使用eventEmitter在 example1 中是非常可扩展的,并且可以使用以下命令轻松地将未来事件添加到对象中eventEmitter功能或外部代理使用标准化接口监视或触发事件。因此,区别不在于您所展示的代码具体实现了什么,而在于它的架构方式以及未来的可扩展性或外部代码如何与您的对象交互

什么时候可以实际使用它?

你会考虑使用eventEmitter几乎任何时候您希望外部各方能够以轻量级且简单的方式观察事件或触发对象上的事件。这是一个预先构建的系统,通常比发明自己的回调通知方案更好。有时,当您不尝试启用外部交互时,它甚至对于您自己的实现也很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js、EventEmitter 为什么使用它 的相关文章

随机推荐