【问题标题】:Why use Node.js EventEmitter instead of just a plain function?为什么要使用 Node.js EventEmitter 而不仅仅是一个普通的函数?
【发布时间】:2016-09-03 09:26:45
【问题描述】:

我读到的每篇关于节点 EventEmitters 的文章都谈到了如何创建它们。但是,我还没有看到一个具体的例子来说明为什么要使用它们而不仅仅是一个简单的函数。例如,这是我正在阅读的书中的一个示例,介绍了如何通过其构造函数在自定义对象上使用 EventEmitter 类。


    var util = require('util');
    var events = require('events');
    var AudioDevice = {
        play: function(track) {
            // Stub: Trigger playback through iTunes, mpg123, etc.
            console.log("playing song: " + track);
        },
        stop: function() {
            console.log("song stopped");
        }
    };

    function MusicPlayer() {
        this.playing = false;
        events.EventEmitter.call(this);
    }

    util.inherits(MusicPlayer, events.EventEmitter);

    var musicPlayer = new MusicPlayer();

    musicPlayer.on('play', function(track) {
        this.playing = true;
        AudioDevice.play(track);
    });

    musicPlayer.on('stop', function() {
        this.playing = false;
        AudioDevice.stop();
    });

    musicPlayer.emit('play', 'The Roots - The Fire');

    setTimeout(function() {
        musicPlayer.emit('stop');
    }, 1000);

但是,以下给出了相同的结果:


var AudioDevice = {
    play: function(track) {
        // Stub: Trigger playback through iTunes, mpg123, etc.
        console.log("playing song: " + track);
    },
    stop: function() {
        console.log("song stopped");
    }
};

function createMusicPlayer() {
    var musicPlayer = {};
    musicPlayer.playing = false;
    musicPlayer.play = function(track) {
        musicPlayer.playing = true;
        AudioDevice.play(track);
    },
    musicPlayer.stop = function(track) {
        musicPlayer.playing = false;
        AudioDevice.stop();
    }

    return musicPlayer
}

var musicPlayer = createMusicPlayer();

musicPlayer.play('The Roots - The Fire');

setTimeout(function() {
    musicPlayer.stop();
}, 1000);

我想知道在使用 node.js 时,事件发射器是一种设计选择还是必需品。我知道有必要理解它们,因为许多模块都采用这种模式,但我很好奇这种选择是否类似于使用工厂而不是构造函数等。换句话说,我可以用 EventEmitters 做什么而我不能用函数做?

【问题讨论】:

  • 一如既往:抽象。你可以不这样做,但你的代码会变得一团糟。

标签: node.js design-patterns publish-subscribe


【解决方案1】:

EventEmitters 用于实现Publish-subscribe pattern。这里的想法是发布者——在你的例子中是MusicPlayer——不知道也不关心谁订阅了他的消息。他的工作只是发出适当的事件,任何收听它们的人都会收到有关该事件的适当通知。

实施发布-订阅模式可以减轻应用程序区域之间的耦合。

【讨论】:

  • 谢谢,我明白了。所以它就像 Android 的事件总线概念。
  • 但是常规函数难道不关心它向谁发送响应吗?
  • 没错。不同之处在于,在常规函数的情况下,调用者是发起者。可以说调用者从函数中“拉”出消息(返回值)。在 pubsub 模式的情况下,想法是每当新消息准备好时通知调用者,而不一定是在订阅时(发射器“推送”消息给订阅者)。此外,在常规函数调用的情况下,每次调用只返回一个值。事件发射器可以发出给定的消息 0、1 或多次(甚至无限次)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多