簡體   English   中英

如何等待諾言解決

[英]How to wait for promises to be resolved

我創建了一個函數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
  }
});

謝謝你的幫助。

您可以使用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 } } 

如前所述,您可以使用Promise.all ,但是其他所有答案在您的verify函數中都沒有任何內容,因此只想提供一個完整的示例。

這是一種實現方式,您可以更改解析以僅將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) ); 

只是在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
     }
 })()

如果要同時運行兩個功能,可以使用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
     }
 })()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM