我的应用程序是一个简单的mysql客户端,它通过命令行连接到数据库,很少查询从数据库获取信息。Mysql功能封装在一个类中,问题在于对mysql服务器的调用是异步的(可以理解)--代码流到达应用程序的末尾。
我无法在Mysql类的方法中引用“this”(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) {
//...
});发布于 2016-10-13 10:23:19
每次跳入回调函数时,都会丢失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函数之外的作用域)。您可以阅读这的文档,您将能够了解更多:
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);
});
}https://stackoverflow.com/questions/40017911
复制相似问题