在node.js应用程序命令行中解决异步问题

时间:2016-10-13 09:59:48

标签: node.js

我的应用程序是一个从命令行使用的简单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) {
  //...
});

1 个答案:

答案 0 :(得分:1)

每次跳转到回调函数时,都会失去this对象的范围。有不同的方法来解决它。

this分配给另一个变量

第一个解决方案是将this对象分配给另一个变量(例如:thatself)。当您将一个变量分配给另一个变量并且第一个变量是一个对象时,您将保留对原始对象的引用,并且您可以在回调中使用它。这样的事情:

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);
  });
}