0

我是 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);

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

谢谢!

4

1 回答 1

1

原因是“this”不是您在尝试调用的代码中认为的那样this.emit('readComplete', data)。在这种情况下,“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

于 2013-10-20T16:46:20.113 回答