Лучший способ использования событий в node.js

Какой лучший подход для прослушивания/запуска событий в node.js? Я тестировал запуск и прослушивание событий в node.js, расширяя модель с помощью EventEmitter, и мне интересно, имеет ли смысл этот подход, поскольку события прослушиваются только тогда, когда есть экземпляр модели. Как можно добиться того, чтобы события прослушивались, пока приложение узла живо?

Пример расширения модели с помощью eventEmitter.

// myModel.js

var util = require('util');
var events2 = require('events').EventEmitter;
var MyModel = function() {

        events2.call(this);
        // Create a event listener
        this.on('myEvent', function(value) {
            console.log('hi!');
        });
    };

MyModel.prototype.dummyFunction = function(params) {
// just a dummy function.

}

util.inherits(MyModel, events2);
module.exports = MyModel;

РЕДАКТИРОВАТЬ: Более четкий вопрос по этому поводу: как сохранить постоянный процесс, который прослушивает события во время выполнения приложения и имеет глобальную область (что-то вроде работающего диспетчера событий, который прослушивает события, созданные в приложении). Было бы решением потребовать файл myModel.js в app.js? Как такие вещи решаются в node.js?


person Endymion    schedule 29.10.2012    source источник


Ответы (1)


Я не совсем уверен, что вы имеете в виду, говоря о том, что события активны только тогда, когда есть экземпляр модели, поскольку без чего-то, что можно было бы слушать и реагировать на них, события не могут происходить.

Сказав это, безусловно, разумно:

util.inherits(global,EventEmitter)
global.on('myEvent',function(){
    /* do something useful */
});

что позволит вам:

global.emit('myEvent')

или даже:

var ee=new EventEmitter();

ee.on('myEvent',...)

Что касается того, как правильно использовать EventEmitter: он определяется как

function EventEmitter() {}

который не предусматривает инициализацию, поэтому должно быть достаточно:

var Thing=function(){};
util.inherits(Thing,EventEmitter);

который расширит экземпляры Thing с помощью:

  • setMaxListeners(num)
  • emit(type,...)
  • addListener(type,listener) -- псевдоним on()
  • once(type,listener)
  • removeListener(type,listener)
  • removeAllListeners()
  • listeners(type)

Единственная возможная ошибка заключается в том, что EventEmitter добавляет свое собственное свойство объекта _events к любому расширенному объекту (this), что предполагает, что вы не должны называть никакие из ваших собственных свойств объекта одним и тем же именем без неожиданного поведения.

person Rob Raisch    schedule 29.10.2012
comment
Роб, большое спасибо за ответ. Я попробую методы, о которых вы сказали, и чтобы прояснить свой вопрос, я имел в виду, что если я запущу узел REPL, я смогу сделать: var app = require('./app'); и после - person Endymion; 31.10.2012
comment
... и после var model = require('mymodel'); var theModel = новая модель(); и, наконец, theModel.emit('myEvent', null); Этот код показывает привет! В любом случае ваш ответ очень интересен, и на самом деле более четкий вопрос должен заключаться в том, как сохранить постоянный процесс, который прослушивает события во время выполнения приложения, и имеет глобальную область действия (что-то вроде работающего диспетчера событий, который прослушивает события, созданные в приложении). - person Endymion; 31.10.2012