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 s предназначенные для внедрения Publish-subscribe pattern. Идея здесь заключается в том, что издатель - в вашем примере это MusicPlayer - не знает и не заботится о том, кто подписывается на его сообщения. Его работа просто испускает надлежащие события, и тот, кто слушает их, получит надлежащее уведомление о событии.

Реализация шаблона публикации-публикации может уменьшить сцепление между областями приложения.

Смежные вопросы