如何使用节点从mySQL初始化变量

时间:2014-01-10 22:26:14

标签: javascript mysql node.js

我觉得我在这里犯了一个明显的错误。我只是想在对象的构造函数中初始化一个变量:

var Lobby = function(io, dbConnection, lobbyName) {
  this.connectedPlayers = {};
  this.seatedPlayers = [];
  for (var i=0;i<this.NUMBER_OF_TABLES;i++) {
    this.seatedPlayers[i] = [];
    for (var j=0;j<this.PLAYERS_PER_TABLE;j++) {
      this.seatedPlayers[i][j] = null;
    }
  }
  if (lobbyName == "lobbya") {
    dbConnection.query("SELECT id, username, rating FROM players WHERE id < 0 order by id desc;",
    function (error, results, fields) {  
      for (var i=0;i<results.length;i++) {
        var computerPlayer = new Player(results[i]["id"],results[i]["username"],results[i]["rating"]);
        this.connectedPlayers[results[i]["id"]] = computerPlayer;
        this.seatedPlayers[i+4][1] = computerPlayer;
        this.connectedPlayers[results[i]["id"]].setSeatedAt(i+4);
      }
    });
  }
}

当我运行它时,connectedPlayers未定义。 (我假设因为它超出了范围,因为我在处理结果的函数内。那么如何在范围之外初始化变量?

1 个答案:

答案 0 :(得分:0)

您无法在Javascript构造函数中初始化异步操作,因为根据定义,构造函数是同步的。

有三种方法可以解决这个常见的问题:

1)传入初始化的数据库。

2)在需要时懒惰加载数据库。

Lobby.prototype.connectPlayers = function(cb) {
    self.getConnection(err, db) {
        // getConnection will either init connection or return already inited connection
        // run stuff requiring DB connection
            cb(foo);
    });
}

3)添加一个异步初始化方法,该方法在new'之后调用。

var lobby = new Lobby();
lobby.init(function(err) {
  // now we have it
});

在我看来,懒惰是最有效的,因为它意味着你没有运行任何超出你需要的东西。某些Lobby可能不需要数据库连接(特别是对于单元测试)。