2013-10-20 6 views
0

저는 Node.js를 처음 사용하며 문제를 디버깅하는 데 문제가 있습니다. 이벤트 발생기 역할을하는 객체를 만들었지 만 이벤트가 발생할 때 콜백이 호출되지 않습니다.EventEmitter에서 상속 한 객체가 이벤트를 발생시키지 않습니다.

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); 
    }); 
}; 

아래에 나열되어이 모듈을 소비하는 코드를 다음과 같이

내 이미 터를 정의했습니다. 내 "readComplete"이벤트에 대한 핸들러는 이미 터에서 this.emit(...)이 호출 되었음에도 불구하고 실행되지 않습니다. 디버거에서 이것을 확인했습니다.

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

왜냐하면 "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

+0

굉장 감사합니다! 나는 이것이'this' 키워드로 인한 문제들에 부딪 힐 유일한 시간이 아니라고 생각합니다. – Kartik

+0

아주 좋은 개요 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this – ksimons

관련 문제