2016-09-03 6 views
2

ノードEventEmittersについて、私が読んだ記事のすべてで、それらを作成する方法について説明しています。しかし、私は単純な関数の代わりにそれらを使う理由の具体例を見ていません。たとえば、これは、コンストラクタを介してカスタムオブジェクトでEventEmitterクラスを使用する方法を読んでいる本の例です。なぜ単純な関数ではなくNode.js 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); 

をイベントエミッタは、設計上の選択や必要であれば、私は思ったんだけどノードで作業するとき私は、多くのモジュールがこのパターンを採用しているので、それらを理解する必要があることはよく知っていますが、その選択がコンストラクタなどを使ってファクトリを使うことに似ているのは興味深いです。言い換えれば、私はEventEmitters ?

+0

いつも通り:抽象化。あなたはそれを行うことはできませんが、あなたのコードは混乱を招くでしょう。 – Bergi

答えて

5

EventEmitterは、Publish-subscribe patternを実装するためのものです。ここでのアイデアは、あなたの例では出版社がMusicPlayerだと、メッセージを購読した人を知らない、または気にしないということです。彼の仕事は単に適切なイベントを出すだけで、イベントを聞いた人はイベントについての適切な通知を受けるでしょう。

publish-subscribeパターンを実装すると、アプリケーションの領域間の結合を緩和できます。

関連する問題