2015-12-06 62 views
0

我已經閱讀無處不在,module.exports被緩存並在第一次調用後每次需要時返回相同的對象。 這裏是我的代碼 -
index.js
module.export緩存如何在節點中工作

var http= require('http');  
var Customer= require('./code/Customer'); 
var Wishlist= require('./code/Wishlist'); 

var server= http.createServer(function(req,res){ 

console.log("Request received"); 


res.end("Request received"); 


}); 

server.listen(3000,function(){ 

    console.log("hello"); 

    }); 

customer.js

var emitter= require('../../lib/EventDispatcher')(); 
emitter.on('wishlist',function(){ 

console.log("Listened to wishlist event"); 

}); 

module.exports= function(){ 

console.log("Inside customer"); 
} 

Wishlist.js

var emitter= require('../../lib/EventDispatcher')(); 

module.exports= function(){ 

console.log("Inside customer"); 
emitter.emit('wishlist'); 
} 

EventDispatcher.js

var emitter= require('events').EventEmitter; 

module.exports= function() { 

console.log("created"); 
return new emitter(); 
} 

如果我的eventDispatcher被緩存,那麼wishlist發出的事件應該被客戶捕獲。但沒有發生。

我正在嘗試爲觀察者創建一個主幹,以便每個模塊都可以自己偵聽事件。是否它是正確的方法?

回答

0

EventDispatcher模塊被緩存,但每次使用它時,都會再次調用模塊構造函數,並且構造函數每次都會創建一個新的發射器對象。因此,每次使用EventDispatcher時,您最終都會得到一個新的單獨的發射器,因爲您每次都調用一個新的構造器。

僅供參考,我沒有看到EventDispatcher模塊的要點。它包裝EventEmitter,但沒有做任何事情。調用者也可以直接創建自己的EventEmitter對象。

爲了得到一個單一的全球EventEmitter對象,您可以將您的模塊改成這樣:

var Emitter = require('events').EventEmitter; 
var sharedEmitter = new Emitter(); 

module.exports= function() { 
    console.log("created"); 
    return sharedEmitter; 
} 
+0

我希望有一個全球eventEmitter對象,這樣以後當我添加新的模塊,就應該能夠觀察到觸發的事件其他模塊。有沒有其他方法可以做到這一點?我只是想,如果導出將被緩存,那麼所有模塊將獲得相同的eventEmitter對象。我想出的一種方法是在索引文件中創建一個eventEmitter,並將其注入構造函數中的每個模塊中。但是這似乎是高度耦合的。如果我錯了,請原諒我。 –

+0

@KrrishRaj - 如果您想要一個共享的發射器對象,請參閱我的答案。 – jfriend00