Javascript、嵌套eventhandler和
我有一个javascript类:Javascript、嵌套eventhandler和,javascript,node.js,this,Javascript,Node.js,This,我有一个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
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',…)
指的是process
,而不是我希望的Server
处理这个案件的最佳模式是什么?A
\u self=this
?在这种情况下,应该在哪里插入该行,我是否应该停止引用this
,而只使用\u self
您可以创建一个局部变量,其中包含对函数作用域中的this
的引用,这将起作用,因为在JavaScript中,变量的作用域由其在源代码中的位置定义,嵌套函数可以访问其外部作用域中声明的变量。[]
在我看来,最好的做法是不断引用
此
如果有可能弄清楚您所引用的内容,在调试过程中可能会错过对所用局部变量的重新赋值,从而难以找到错误。similiar+1。如果你坚持使用这种模式,其他人很快就会学会寻找lcoal作业。我还喜欢为实例使用构造函数名称(服务器->服务器),因此很明显,它就是实例(一旦你知道了模式),所以Server.process=…
和Server.status=…
加强了方案。额外问题:我已经按照你的建议更改了代码,并且它不再在流程对象上创建新的状态属性。但是它也不会改变正确的状态属性。我得到了log语句,但是这个.status
,或者服务状态
,仍然是true
。还有什么不对的吗?我还试图清除exit事件中的process属性,但这导致了很大的麻烦……额外的答案是:我将serv
变量放在start函数之外。我必须说我很难理解这个。。。(双关语无意…)你当时把它放在哪里了?如果是全局值,则无论何时启动新服务器,都将覆盖当前值。
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);});
};