【问题标题】:Node.js, EventEmitter of why using itNode.js, EventEmitter 为什么使用它
【发布时间】:2017-12-08 07:01:56
【问题描述】:

我对 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的示例2

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

【问题讨论】:

    标签: node.js eventemitter


    【解决方案1】:

    第一个示例子类化了一个事件发射器,然后使用该事件发射器来实现一些功能。这意味着其他任何人都可以获取您的student_max 对象之一并为scored 消息注册一个事件侦听器,或者他们甚至可以自己发出scored 消息。然后,您可以非常轻松地使用 eventEmitter 功能扩展到您的对象中发生的其他事件,然后任何第三方也可以观察或触发这些事件。 eventEmitter 是公开基于事件的功能的标准化方式。您可以通过设计自己的通知方案来使用eventEmitter 完成任务,但通常最好建立在许多开发人员已经知道并且已经内置大量功能的标准方案上。

    您当前编码的第二个示例完成了同样的事情,但没有那么可扩展。例如,如果您想知道 score 发生的任何事情,您将不得不子类化该对象并覆盖 score 方法,而不仅仅是使用完善的 eventEmitter 接口向事件添加侦听器。如果您没有自己创建对象(这使得子类化变得困难),那么您必须对 score 方法进行猴子补丁才能观察它。

    example1和example2有什么区别

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

    在示例 1 中使用 eventEmitter 具有很强的可扩展性,并且可以很容易地使用 eventEmitter 功能将未来的事件添加到对象中,或者让外部代理使用标准化接口监视或触发事件。因此,区别不在于您展示的代码究竟实现了什么,而在于它的架构方式以及未来的可扩展性或外部代码如何与您的对象交互

    什么时候可以使用?

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

    【讨论】:

    • 谢谢你+++++完美的解释。
    • @DavidInu071 - 由于您可能是这里的新手,如果这回答了您的问题,您可以通过单击问题左侧的绿色复选标记向社区表明这一点。遵循正确的程序,这也将为您赢得一些声誉积分,而更多的声誉积分最终将为您赢得更多特权。
    • 没错,我是新来的,我的问题似乎找不到绿色复选标记。我唯一看到的是赞成票/反对票() 和最喜欢的开始。
    • 你说得对,我只是设法做到了。它有一个灰色的背景颜色,因为我赞成你回答,所以在我看来,如果它是一个灰色的复选标记,告诉我我已经赞成你的回答,抱歉这个错误。现在已经完成了:),再次感谢。
    • 最终理解 Node.js 中回调、承诺和事件之间区别的最佳方法。谢谢。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签