Каждая статья, которую я прочитал об узле 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, которые я не могу делать с функциями ?
Как всегда: Абстракция. Вы можете сделать это без, но ваш код будет беспорядок. – Bergi