module.export缓存如何在节点中工作

时间:2015-12-06 09:54:11

标签: node.js

我已经读过无处不在的module.exports被缓存并在第一次调用后每次需要时返回相同的对象。 这是我的代码 -
index.js

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发出的事件应该被客户捕获。但它没有发生。

我正在尝试为观察者创建一个骨干,以便每个模块都可以自己监听事件。这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

EventDispatcher模块被缓存,但每次使用它时,您都会再次调用模块构造函数,并且构造函数每次都会创建一个新的发射器对象。因此,每次使用EventDispatcher时,您最终会得到一个新的独立发射器,因为您每次都在调用一个新的构造函数。

仅供参考,我没有看到EventDispatcher模块的重点。它包装了EventEmitter,但是没有做任何事情。调用者也可以直接创建自己的EventEmitter对象。

要获取单个全局EventEmitter对象,可以将模块更改为:

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

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