首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在node.js应用程序命令行中绕过异步问题

问在node.js应用程序命令行中绕过异步问题
EN

Stack Overflow用户
提问于 2016-10-13 09:59:48
回答 1查看 67关注 0票数 1

我的应用程序是一个简单的mysql客户端,它通过命令行连接到数据库,很少查询从数据库获取信息。Mysql功能封装在一个类中,问题在于对mysql服务器的调用是异步的(可以理解)--代码流到达应用程序的末尾。

我无法在Mysql类的方法中引用“this”(Mysql)。

我该如何解决这个问题?

下面是我的密码。

代码语言:javascript
复制
//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) {
  //...
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-13 10:23:19

每次跳入回调函数时,都会丢失this对象的作用域。有不同的方法来解决这个问题。

将分配给另一个变量

第一个解决方案是将this对象赋值给另一个变量(例如:that、self)。当将一个变量赋值给另一个变量,而第一个变量是对象时,则保留对原始对象的引用,并且可以在回调中使用它。就像这样:

代码语言:javascript
复制
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函数之外的作用域)。您可以阅读这的文档,您将能够了解更多:

代码语言:javascript
复制
Mysql.prototype.getDbInfo = function (cbk) {
  this.showTables(function(e,r) {
    // >>>>>>>>>> PROBLEM HERE using 'this' <<<<<<<<<<<
    console.log(self.configVar);
  }.bind(this));

}

使用es6箭头函数

它与第一种解决方案大致相同。如果您使用一个转发程序,您将发现它被翻译成第一个解决方案:

代码语言:javascript
复制
Mysql.prototype.getDbInfo = function (cbk) {
  self.showTables((e,r) => {
    // >>>>>>>>>> PROBLEM HERE using 'this' <<<<<<<<<<<
    console.log(this.configVar);
  });
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40017911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档