Node.js EventEmitter - 坏事正在发生

时间:2013-11-21 11:32:03

标签: node.js

我一直在尝试解决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实例在内存中持续存在)。

为什么会这样? (我希望看到每次请求第一次请求时得到的输出。)

1 个答案:

答案 0 :(得分:2)

感谢freenode上的#node.js上的人帮助解决这个问题:

  

当然,但每次附加听众时,都会将它们附加到同一个发射器上   由于您没有将原型的状态本地化到您的实例,因此原型方法会对原型对象的状态起作用。   我相信你可以通过在构造函数

中简单地执行EventEmitter.call(this)来解决它

有关详细信息,请参阅以下链接: