我一直在尝试解决nodejs应用程序中的错误,并将其缩小到我实现事件发射器的方式。该应用程序是一个express.js应用程序,具有使用类。我必须缺少NodeJS的一些关键方面,包括内存使用和类/对象生命周期。我希望有人可以指出为什么我正在做的事情没有按预期工作。
以下是代码:
// ServiceWrapper.js:
var events = require('events');
var ServiceClient = function(opts) {
this.foobar = "";
this.opts = opts;
this.hasFoo = false, this.hasBar = false;
}
ServiceClient.prototype = new events.EventEmitter();
ServiceClient.prototype.getFoo = function() {
var self = this;
self.hasFoo = true;
self.foobar += "foo";
self.emit('done','foo');
}
ServiceClient.prototype.getBar = function() {
var self = this;
self.hasBar = true;
self.foobar += "bar";
self.emit('done','bar');
}
var ServiceWrapper = function(){}
ServiceWrapper.prototype.getResponse = function(options, callback) {
var servClient = new ServiceClient({});
servClient.on('done', function(what) {
if (servClient.hasFoo && servClient.hasBar) {
console.log("foo && bar")
callback(servClient.foobar);
}
else {
console.log("Don't have everything: " + servClient.foobar);
}
});
servClient.getFoo();
servClient.getBar();
}
module.exports = ServiceWrapper
然后在我的快递应用中:
var ServiceWrapper = require('ServiceWrapper');
app.get('/serviceReponse', function(req,res) {
var servWrapper = new ServiceWrapper();
servWrapper.getResponse(function(ret) {
res.end(ret);
});
});
Web应用程序上的行为按预期工作:响应设置为“foobar”。但是,查看日志,看起来有内存泄漏 - servWrapper
的多个实例。启动应用程序后,第一个请求生成:
Don't have everything: foo
foo && bar
但是,如果我刷新页面,我会看到:
foo && bar
Don't have everything: foo
foo && bar
foo && bar
每次刷新时,侦听器都会检测到多个“已完成”事件 - foo && bar
输出不断增长(假设有越来越多的ServiceWrapper实例在内存中持续存在)。
为什么会这样? (我希望看到每次请求第一次请求时得到的输出。)
答案 0 :(得分:2)
感谢freenode上的#node.js上的人帮助解决这个问题:
当然,但每次附加听众时,都会将它们附加到同一个发射器上 由于您没有将原型的状态本地化到您的实例,因此原型方法会对原型对象的状态起作用。 我相信你可以通过在构造函数
中简单地执行EventEmitter.call(this)来解决它
有关详细信息,请参阅以下链接: