0

在 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中如何解决这种事情?

4

1 回答 1

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

唯一可能的“陷阱”是 EventEmitter 将自己的_events对象属性添加到任何扩展对象 ( this) 中,这表明您不应使用相同的名称命名您自己的任何对象属性,否则会出现意外行为。

于 2012-10-29T19:28:59.113 回答