2014-05-01 6 views
1

Мне сложно понять, почему это так сложно, поэтому я подозреваю, что делаю что-то очень не так. Скажем, у меня есть два контроллера, которые выглядят примерно так. Они почти клоны в отношении конечных точек, но не работает - вроде реализаций интерфейсаПодписки подписчиков на Node.js на нескольких контроллерах

(function(someController){ 
    //some require statements 
    var importantEvent = require("../Connectors/SaveEvents"); 

    someController.init = function(app){ 
     //app.get, app.post, etc etc etc 
     app.post('/saveThat', function(req, res){ 
      //do some stuff 

      importantEvent.Saved({ from: "someController", data: stuff }); 
     }); 
    } 

    importantEvent.on('Saved', function(data){ 
     //let this guy know it happened then do some stuff 
    }) 
})(module.exports); 

Ok? ОК. Мое событие эмиттер вещь, которая не работает, и я подозреваю, что это очень неправильно выглядит, как это ... (SaveEvents.js)

(function(ImportantEvent){ 

    var util = require('util'); 
    var eventEmitter = require('events').EventEmitter; 

    eventEmitter.call(ImportantEvent); //??? is this needed? 

    ImportantEvent.Saved = function(origin, dataPayload) { 
     //maybe do some stuff to the data 
     var self = this; 
     self.emit('Saved', { from: origin, data: dataPayload }); 
    }; 

    util.inherits(OAuthEvents, eventEmitter); 

})(module.exports); 

, когда я использую хрюкать, я получаю не-го

c:\projects\srsly\node\someController.js:21 
     importantEvent.on('Saved', function(data){ 
        ^
TypeError: Object #<Object> has no method 'on' 

Понял, почему и как лучше это делать?

ответ

1

Я думаю, что проблема, с которой вы столкнулись, связана с тем, как вы настраиваете свой излучатель событий. Функция on является частью прототипа EventEmitter. Это означает, что вам нужно создать экземпляр, а не просто вызвать конструктор на объект, который у вас уже есть. Если переписать ImportantEvent следующим образом, вы должны получить функцию on и, возможно, остальные ваши вещи начнут работать:

module.exports = (function(eve){ 
    var EventEmitter = require('events').EventEmitter; 
    var ImportantEvent = new EventEmitter(); 

    ImportantEvent.Saved = function(origin, dataPayload) { 
     this.emit('Saved', {from: origin, data:dataPayload}); 
    }; 

    return ImportantEvent; 
})(); 
2

Это будет работать, как вы хотите. Имейте в виду, что module.exports будет кэшироваться, и когда вы запустите require('ImportantEvent') во второй раз, вы получите ранее инициализированный экземпляр (singleton)

var inherits = require('util').inherits, 
    EventEmitter = require('events').EventEmitter; 

function ImportantEvent(){} 

inherits(ImportantEvent, EventEmitter); 

ImportantEvent.prototype.Saved = function(){} 

module.exports = new ImportantEvent(); 
Смежные вопросы