如何等待Promise解析?双用户游戏状态校验遇[object Promise]问题
解决多Promise校验用户游戏状态的问题
嘿,我来帮你搞定这个Promise的问题!你看到的[object Promise]输出,是因为你直接操作了未完成的Promise对象,而不是它最终返回的布尔值结果。咱们一步步来修正:
问题根源
verifyIfUserIsInGame(userId)返回的是一个Promise(因为内部包含异步的Firebase查询逻辑),它代表一个“未来才会完成的操作”。如果你直接打印它或者用它做判断,拿到的只是这个Promise对象本身,不是最终的true/false。
解决方案:用Promise.all处理多个Promise
要同时校验两个用户的状态,最高效的方式是用Promise.all——它能并行发起多个异步请求,等所有请求都完成后统一处理结果。
方法1:使用.then()链式调用
这种方式适合不使用async/await的场景:
// 假设你的两个用户ID是userAId和userBId const userId1 = "用户1的ID"; const userId2 = "用户2的ID"; Promise.all([ verifyIfUserIsInGame(userId1), verifyIfUserIsInGame(userId2) ]) .then(([user1IsInGame, user2IsInGame]) => { // 这里拿到的是两个Promise的最终结果:true或false if (user1IsInGame && user2IsInGame) { console.log("两名用户都在游戏中!"); // 在这里编写两个用户都符合条件后的逻辑 } else { console.log("至少有一名用户不在游戏中"); // 处理不符合条件的情况 } }) .catch((error) => { console.error("校验用户状态时出错:", error); // 处理Firebase查询失败等异常情况 });
方法2:使用async/await(更直观)
如果你的代码在async函数中,可以用await把异步代码写成同步风格,可读性更强:
async function checkBothUsersInGame(user1Id, user2Id) { try { // 并行发起两个校验请求(比逐个await更高效) const [user1IsInGame, user2IsInGame] = await Promise.all([ verifyIfUserIsInGame(user1Id), verifyIfUserIsInGame(user2Id) ]); if (user1IsInGame && user2IsInGame) { console.log("两名用户都在游戏中!"); // 后续业务逻辑 } else { console.log("至少有一名用户不在游戏中"); // 处理不符合条件的场景 } } catch (error) { console.error("校验出错了:", error); // 捕获并处理异常 } } // 调用这个函数 checkBothUsersInGame("用户1的ID", "用户2的ID");
关键提醒
- 永远不要直接使用Promise对象的返回值,必须通过
.then()或者await来获取它最终resolved的结果。 Promise.all会并行处理所有异步请求,比逐个await两个函数要快,因为两个Firebase查询可以同时进行。
内容的提问来源于stack exchange,提问作者Jean
相关产品推荐
相关产品推荐

