为什么使用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
– 不知道或关心谁订阅了他的消息。 他的工作就是发出适当的事件,听谁的人会收到有关事件的适当通知。
实现发布 – 订阅模式可以缓解应用程序区域之间的耦合。
- MongoDB对每个用户的db.collection.distinct()的效率与保存为数据库条目和检索结果
- 使用rabbitmq与multithreading之间的差异
- 如何避免使用dependency injection时使用types检查逻辑填充我的JavaScript代码?
- 在angular度2中设置material-datepicker的date格式
- 模型中的骨干集合+使用Node.js的宁静服务器devise
- 在Javascript中分享服务器和客户端之间的代码是什么意思?
- 关系数据库devise到mongoDB / mongoosedevise
- Webpack在JS文件中引发一个奇怪的语法错误
- 在javascript中使用asynchronouscallback模式的无限循环