私は mongodb に Collection を持っています。これには参照ドキュメントが埋め込まれているため、複数の anon 関数を実行する必要があります。
まず、この配列を初期化します
var player = {
name : '',
life : 10,
gold : 50,
score : 0,
clientId : socket.id,
playerId : data.playerId,
deck : []
};
次に、mongodb からデータをフェッチして、デッキにデータを追加する必要があります。
// First find the player.
var playerCol = db.collection('Guest');
playerCol.find({'_id' : new ObjectId(data.playerId)}).toArray(function(err, playerRes) {
// Traverse and load each tower in deck.
// Traverse each embedded reference, so each can be fetched.
playerRes[0].deck.towers.forEach(function(tower) {
// fetch data for tower.
towerCol = db.collection('Tower');
towerCol.find({'_id' : new ObjectId(tower.oid)}).toArray(function(err, completeTower) {
// Add the tower data to the deck.
player.deck.push(completeTower.pop());
});
});
ここでの問題は、プレーヤー配列が最初に初期化されたときのままであることです。プレーヤーのデータが保持されないのはなぜですか? 無名関数内で呼び出されていない場合は別のスコープにあるため、その理由はよくわかります。しかし、自分の値をプレーヤー配列に追加するにはどうすればよいでしょうか?
ワンピースのスニペット。
// Initialize the player.
var player = {
name : '',
life : 10,
gold : 50,
score : 0,
clientId : socket.id,
playerId : data.playerId,
deck : []
};
// Load players deck.
var playerCol = db.collection('Guest');
playerCol.find({'_id' : new ObjectId(data.playerId)}).toArray(function(err, playerRes) {
// Traverse and load each tower in deck.
playerRes[0].deck.towers.forEach(function(tower) {
towerCol = db.collection('Tower');
towerCol.find({'_id' : new ObjectId(tower.oid)}).toArray(function(err, completeTower) {
player.name = "Melvar";
player.deck.push(completeTower.pop());
console.log(player.deck); // Prints the data, just pushed
});
});
console.log(player.deck); // Prints empty array.
process.exit(1);