我的应用程序是一个从命令行使用的简单mysql客户端 - 它连接到数据库并进行少量查询以从数据库获取信息。 Mysql功能封装在一个类中,问题是因为对mysql服务器的调用是异步的(可以理解) - 代码流到达应用程序的末尾。
而且我无法在Mysql类的方法中引用这个'(Mysql)。
如何解决这个问题?
以下是我的代码。
//CLASS
function Mysql(config) {
//...
}
//METHOD
Mysql.prototype.getDbInfo = function (cbk) {
this.showTables(function(e,r) {
// >>>>>>>>>> PROBLEM HERE using 'this' <<<<<<<<<<<
console.log(this.configVar);
});
}
module.exports = Mysql;
//CLASS OBJECT
var test = new Mysql(config);
//METHOD INVOKE
test.getDbInfo(function (err,results) {
//...
});
答案 0 :(得分:1)
每次跳转到回调函数时,都会失去this
对象的范围。有不同的方法来解决它。
将this
分配给另一个变量
第一个解决方案是将this
对象分配给另一个变量(例如:that
,self
)。当您将一个变量分配给另一个变量并且第一个变量是一个对象时,您将保留对原始对象的引用,并且您可以在回调中使用它。这样的事情:
Mysql.prototype.getDbInfo = function (cbk) {
var self = this;
self.showTables(function(e,r) {
// >>>>>>>>>> PROBLEM HERE using 'this' <<<<<<<<<<<
console.log(self.configVar);
});
}
将this
对象绑定到函数
您可以将this
对象绑定到该函数,就像您将this
关键字设置为提供的值(在您的情况下,showTables
函数之外的范围)。您可以阅读this的文档,您将能够了解更多:
Mysql.prototype.getDbInfo = function (cbk) {
this.showTables(function(e,r) {
// >>>>>>>>>> PROBLEM HERE using 'this' <<<<<<<<<<<
console.log(self.configVar);
}.bind(this));
}
使用es6箭头功能
它或多或少与第一个解决方案相同。如果你使用一个转换器,你会发现它被翻译成第一个解决方案:
Mysql.prototype.getDbInfo = function (cbk) {
self.showTables((e,r) => {
// >>>>>>>>>> PROBLEM HERE using 'this' <<<<<<<<<<<
console.log(this.configVar);
});
}