2014-01-10 43 views
0

我覺得我在這裏犯了一個明顯的錯誤。我只是想在一個對象的構造函數初始化變量:如何使用節點從mySQL初始化一個變量

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

您不能在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「d異步初始化方法。

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

在我看來,懶加載是最有效的,因爲它意味着你沒有超出你的需要運行任何東西。一些Lobby可能不需要數據庫連接(尤其是單元測試)。

+0

是有道理的...添加當然有效。非常感謝! – a2zCribbage