从EventEmitter继承的对象不会引发事件

时间:2013-10-20 16:36:40

标签: javascript node.js eventemitter

我是Node.js的新手,在调试问题时遇到问题。我创建了一个充当事件发射器的对象,但是,在发出事件时不会调用我的回调。

我已将发射器定义如下:

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

// this is the object which will inherit from EventEmitter
function RequestStreamReader() {
    EventEmitter.call(this);
}
util.inherits(RequestStreamReader, EventEmitter);
module.exports = RequestStreamReader;

RequestStreamReader.prototype.read = function(req) {
    var data = '';
    req.on('data', function(chunk){
        data += chunk;
    });
    req.on('end', function() {
        this.emit('readComplete', data);
    });
};

下面列出了使用此模块的代码。尽管在发射器中调用this.emit(...)这一事实,我的“readComplete”事件的处理程序仍未执行(我已在调试器中对此进行了验证)。

var Reader = require("../utils/requestStreamReader.js");

var reader = new Reader();
reader.on('readComplete', function(data){
    var userData = JSON.parse(data);
    var newUser = userModule.createFromDto(userData);
    userRepository.create(newUser, onSuccess, onFailure);
});
reader.read(req);

关于我可能做错的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:1)

原因是您尝试调用this.emit('readComplete', data)的代码中的“this”不是您认为的。在该上下文中,“this”指的是回调函数而不是封闭对象。你需要这样做:

RequestStreamReader.prototype.read = function(req) {
    var data = '';
    var self = this;
    req.on('data', function(chunk){
        data += chunk;
    });
    req.on('end', function() {
        self.emit('readComplete', data);
    });
};

你甚至可以在node.js本身的实际源代码中看到相同的技术:https://github.com/joyent/node/blob/master/lib/http.js#L80