为什么使用Node.js EventEmitter而不是一个普通的函数?

我读过的关于节点EventEmitters的每篇文章都会谈到如何创build它们。 但是,我还没有看到为什么要使用它们而不是一个简单的函数的具体例子。 所以例如,这是我正在阅读的一本书中如何通过其构造函数在自定义对象上使用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); 

我想知道是否事件发射器是一个devise的select或与节点工作的必要性。 我知道它是必要的,因为许多模块使用这种模式,但我很好奇,如果这种select类似于在构造函数等使用工厂。换句话说,有什么我可以做EventEmitters我不能做的function?

EventEmitter是为了实现发布 – 订阅模式 。 这里的想法是,发行商 – 在你的例子中是MusicPlayer – 不知道或关心谁订阅了他的消息。 他的工作就是发出适当的事件,听谁的人会收到有关事件的适当通知。

实现发布 – 订阅模式可以缓解应用程序区域之间的耦合。