自从
createGame()
似乎依赖于一些异步操作来正确初始化游戏,您不能仅从同步返回已完成的游戏对象
createGame()
. 正如你已经观察到的,
createGame()
将在任何异步操作完成之前返回游戏对象。因此,相反,您需要做的是返回一个承诺,其解析值是游戏对象,然后您需要将所有异步操作正确地链接在一起,以便在游戏对象完成时解析您的主要承诺。以下是一种构造方法:
createGame(playerName, socketID, boardSize) {
this.contadorID = this.contadorID+1;
var game = new MemoryGame(this.contadorID, playerName, boardSize);
console.log("a");
return game.getTiles().then(response=> {
console.log("getTiles");
game.tiles = game.getRandomNPieces(response.data.data, game.board.length/2);
console.log(game.tiles);
console.log('=>' + game.tiles);
console.log("b");
// return nested promise so it chains into main promise chain
return game.getHidden().then(response=>{
game.hidden = game.getRandomHidden(response.data.data);
});
}).then(() => {
// finish initializing game object and
// make it be the resolved value of the returned promise
game.player1SocketID = socketID;
this.games.set(game.gameID, game);
return game;
}).catch(function (error) {
// log error and rethrow so promise stays rejected
// this will log for any of our rejected promises since they are chained
console.log(error);
throw error;
});
}
而且,这种变化
createGame()
为了回报承诺,你必须改变使用承诺的方式:
someObj.createGame(...).then(game => {
// game object is ready to use here
}).catch(err => {
// error creating game object
});