在node.js中使用事件的最佳方式

时间:2012-10-29 13:50:37

标签: node.js events event-handling eventemitter

在node.js中监听/启动事件的最佳方法是什么? 我一直在通过使用EventEmitter扩展模型来测试node.js中的事件启动和监听,我想知道这种方法是否有意义,因为只有在有模型实例时才会监听事件。 如何在节点应用程序处于活动状态时监听事件?

使用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;
编辑:关于这个问题的一个更明确的问题是:如何在应用程序执行期间保留一个监听事件的永久进程,并且它具有全局范围(类似于正在运行的事件管理器,用于侦听应用程序中生成的事件)。 是app.js中需要文件myModel.js的解决方案吗?如何在node.js中解决这类问题?

1 个答案:

答案 0 :(得分:0)

我不完全确定在存在模型实例时仅对活动有何意义,因为没有东西可以监听并对它们作出反应,事件不会发生。

话虽如此,这当然是合理的:

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) - 别名为()
  • once(type,listener)
  • removeListener(type,listener)
  • removeAllListeners()
  • listeners(type)

唯一可能的“问题”是EventEmitter将自己的_events对象属性添加到任何扩展对象(this),这表明您不应该使用相同名称命名任何自己的对象属性出乎意料的行为。