2012-11-01 3 views
0

나는이 자바 스크립트 클래스가자바 스크립트, 중첩 된 이벤트 핸들러이

내 문제는 process하지 Serverthisthis.process.on('exit', ...)의 내부 referes 내가 그것을가 원하는만큼 것입니다.

이 케이스를 처리하는 가장 좋은 패턴은 무엇입니까? _self = this? 이 경우 해당 행을 어디에 삽입해야하며 this을 참조하지 않고 대신 _self만을 사용해야합니까?

+1

유사 http://stackoverflow.com/questions/13167630/why-is-the-this-variable-not-the-expected-value – Musa

답변

2

함수 범위에서 this에 대한 참조를 보유하는 로컬 변수를 만들 수 있습니다. 자바 스크립트에서 변수의 범위는 소스 코드 내의 해당 위치에 의해 정의되고 중첩 된 함수는 변수가 외부 범위에 선언했다. [1] 제 생각에는

Server.prototype.start = function() { 
    var serv = this; // Reference to local object for use in inner-functions 

    this.process = spawn('java', ['-jar', this.definition.jarfile]); 
    this.status = true; 

    this.process.on('exit', function(code, signal){ 
     serv.status = false; 
     console.log('Server stopped: code=' + code + ', signal=' + signal); 
    }); 

    this.process.stdout.on('data', function(data){ console.log('stdout: ' + data);}); 
    this.process.stderr.on('data', function(data){ console.log('stderr: ' + data);}); 
}; 

가 어디 이제까지 수 당신이 다스 려있는 것을 명확하게하는 this로 다스 려 유지하는 가장 좋은 방법이며, 하나의 재 할당을 놓칠 수도 있습니다 디버깅 중에 로컬 변수를 사용하여 오류를 찾기 어렵게 만듭니다.

+0

+1. 이 패턴을 일관되게 사용하면 다른 사람들은 곧 숯불 지정을 찾는 법을 배웁니다. 또한 인스턴스 (서버 -> 서버)의 생성자 이름을 사용하는 것이 좋기 때문에 (인스턴스를 알고 나면) 인스턴스라는 것을 알 수 있으므로'server.process = ...'및'server.status = ...'는 계획. – RobG

+0

보너스 질문 : 제안대로 코드를 변경 했으므로 더 이상 프로세스 개체에 새 상태 속성을 만들지 않습니다. 하지만 올바른 상태 속성을 변경하지는 않습니다. 나는 log-statement를 얻지 만'this.status' 나'serv.status'는'true'로 남습니다. 틀린 것이 있습니까? 또한 exit 이벤트에서 프로세스 속성을 지우려고했지만 큰 문제로 이어집니다. – Vegar

+0

보너스 대답 : start 함수 외부에 'serv' 변수를 두었습니다. 나는이 말을 이해하는 데 어려움이 있다고 말해야 만한다. (의도하지 않은 말 ...) – Vegar

관련 문제