如何等待承诺得到解决

时间:2018-04-08 13:10:06

标签: javascript function asynchronous promise es6-promise

我创建了一个函数verifyIfUserIsInGame(userId),它允许检查作为参数给出的用户是否在游戏中。此函数搜索Firebase数据库并返回true或false。 (所以这是函数中的承诺)。

我想现在想检查,一旦为2个用户执行了该功能,如果他们在游戏中。 我对承诺不太满意。我制作了这段代码,但由于我在控制台日志中得到[object Promise],因此无法正常工作。

  // We check that both users are in this game
  user1IsInGame = verifyIfUserIsInGame(user1Id); // must return true or false
  user2IsInGame = verifyIfUserIsInGame(user2Id); // must return true or false

  console.log("user1: " + user1IsInGame);
  console.log("user2: " + user2IsInGame);

  if (userIsInGame && user2IsInGame) {
    // The users are in game
  } else {
    // The users are not in game
  }
});

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

您可以使用asyncawait来实现异步。



async function verifyIfUserIsInGame() {
  //the content of your function
  return true;
}


async function func() {
  // We check that both users are in this game
  const user1IsInGame = await verifyIfUserIsInGame(user1Id); // must return true or false
  const user2IsInGame = await verifyIfUserIsInGame(user2Id); // must return true or false

  console.log("user1: " + user1IsInGame);
  console.log("user2: " + user2IsInGame);

  if (userIsInGame && userToKillIsInGame) {
    // The users are in game
  } else {
    // The users are not in game
  }
}




答案 1 :(得分:1)

如前所述,您可以使用Promise.all,但其他答案都没有验证功能中的任何内容,所以只想提供一个完整的示例。

这是一种方法,您可以将解决方案更改为仅传递true / false,然后更改if语句。

function verifyIfUserIsInGame(user_id) {
  return new Promise((resolve, reject) => {
    resolve({ id: user_id, inGame: true });
  });
}

// run this when all checks have been performed.
function callbackFunction(players){

  let playersReady = 0;
  players.forEach(player => {
    if(player.inGame){
      console.log(`player ${player.id} are in the game`);
      playersReady++;
    }
  });
  if(playersReady === players.length){
    console.log("All players are in the game");
  }
  
}


// the checks we want to perform
const verifyAllUsers = [
  verifyIfUserIsInGame(1),
  verifyIfUserIsInGame(2)
];

// wait for promises to finish.
Promise.all(verifyAllUsers)
       .then( users => callbackFunction(users) )
       .catch( err => console.error(err) );

答案 2 :(得分:0)

承诺可能只是await吗? :

 (async function() {
    const user1IsInGame = await verifyIfUserIsInGame(user1Id); // must return true or false
    const user2IsInGame = await verifyIfUserIsInGame(user2Id); // must return true or false

    console.log("user1: " + user1IsInGame);
    console.log("user2: " + user2IsInGame);

     if (userIsInGame && userToKillIsInGame) {
       // The users are in game
     } else {
       // The users are not in game
     }
 })()

答案 3 :(得分:0)

如果要同时运行两个函数,可以使用Promise.all:

  (async function() {
    const usersAreInGame = await Promise.all(verifyIfUserIsInGame(user1Id), 
                                            verifyIfUserIsInGame(user2Id)); 

     if (usersAreInGame[0] && usersAreInGame[1]) {
       // The users are in game
     } else {
       // The users are not in game
     }
 })()