我是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);
关于我可能做错的任何想法?
谢谢!
答案 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