我觉得我在这里犯了一个明显的错误。我只是想在对象的构造函数中初始化变量:
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 未定义。 (我假设是因为它超出了范围,因为我在处理结果的函数内。那么如何初始化范围之外的变量?
最佳答案
您无法在 Javascript 构造函数中初始化异步操作,因为根据定义,构造函数是同步的。
解决此问题的常见方法有以下三种:
1)传入一个初始化的DB。
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
可能不需要数据库连接(特别是对于单元测试)。
关于javascript - 如何使用 Node 从 mySQL 初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21055607/