我觉得我在这里犯了一个明显的错误。我只是想在对象的构造函数中初始化一个变量:
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未定义。 (我假设因为它超出了范围,因为我在处理结果的函数内。那么如何在范围之外初始化变量?
答案 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
可能不需要数据库连接(特别是对于单元测试)。