【发布时间】: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