2012-10-29 46 views
0

這是在node.js中監聽/啓動事件的最佳方法嗎? 我一直在使用EventEmitter擴展模型來測試事件啓動和監聽node.js,我想知道這種方法是否有意義,因爲事件只有在有模型實例時纔會被監聽。 如何在節點應用程序有效時監聽事件?在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中解決這類問題?

回答

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); 

這將延長東西的情況下,有:

  • setMaxListeners(num)
  • emit(type,...)
  • addListener(type,listener) - - 別名()
  • once(type,listener)
  • removeListener(type,listener)
  • removeAllListeners()
  • listeners(type)

唯一可能的 「疑難雜症」 是EventEmitter添加自己_events對象屬性的任何擴展的對象(this),這意味着你不應該指定任何的您自己的具有相同名稱的對象屬性,而沒有意外的行爲

+0

Rob,非常感謝您的回答。我會嘗試你說的技巧,並澄清我的問題,我的意思是,如果我運行節點REPL我可以做的:var應用=需要(「./應用」);並在 – Endymion

+0

之後...以及var model = require('mymodel')之後; var theModel = new model();最後theModel.emit('myEvent',null);此代碼顯示「hi!」。無論如何,你的答案是非常有趣的,實際上一個更明確的問題應該是如何在應用程序執行過程中保持一個永久性進程來監聽事件,並且它具有全局範圍(類似於正在運行的事件管理器,用於監聽應用程序中產生的事件) 。 – Endymion