2012-11-01 25 views
0

我有這樣的JavaScript類:的Javascript,嵌套事件處理程序,這

var Server = (function() { 

var spawn = require('child_process').spawn; 

function Server(serverDefinition) { 
    this.definition = serverDefinition; 
    this.status = false; 
} 

Server.prototype.start = function() { 
    this.process = spawn('java', ['-jar', this.definition.jarfile]); 
    this.status = true; 

    this.process.on('exit', function(code, signal){ 
     this.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);}); 
}; 

return Server; 

})();

我的問題是this內的this.process.on('exit', ...) referes到process,不Server,我想它。

處理這種情況的最佳模式是什麼? A _self = this?在那種情況下,應該在哪裏插入該行,並且我應該停止提及this,而只使用_self來代替?

+1

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

回答

2

您可以創建一個局部變量,該變量在函數作用域中保存對this的引用,這將起作用,因爲在JavaScript中,變量的作用域由源代碼中的位置定義,並且嵌套函數可以訪問在其外部聲明的變量。[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。如果你始終如一地使用這種模式,其他人將很快學會尋找lcoal任務。我也喜歡使用實例的名稱(服務器 - >服務器),所以顯然它是實例(一旦你知道模式),所以'server.process = ...'和'server.status = ...'強化了方案。 – RobG

+0

獎金問題:我已經按照您的建議更改了我的代碼,並且它不再在過程對象上創建新的狀態屬性。但它也不會更改正確的狀態屬性。我得到了log-statement,但是'this.status'或'serv.status'仍然是'true'。還有什麼是錯的嗎?我也嘗試清除退出事件中的進程屬性,但這會導致很大的麻煩...... – Vegar

+0

獎金回答:我將'serv'變量放在啓動函數之外。我必須說我無法理解這一點......(雙關不打算......) – Vegar