当前位置: 首页 > 知识库问答 >
问题:

如何使数组过滤器工作与异步函数端?[重复]

屠锐
2023-03-14

我正在开发一个小型纸牌游戏网页应用程序。我正在使用一个“房间”系统来容纳每个游戏及其玩家。每个房间都有一个玩家列表,我需要过滤这个列表,以便只获得在Firebase实时数据库中有值的玩家列表。在本例中,我将在/state/{userId}中检查它们的用户存在。

我原以为我可以很简单地将其拼凑在一起,但是过滤后的players数组,或者activePlayers,在过滤完成之前就被读取了。

用forEach演示:

function debugActivePlayers (players) {
  activePlayers = []
  players.forEach(player => {
   firebase.ref('/status/' + player)
     .once('value')
     .then(snapshot => {
       console.log(snapshot.val()) // 'offline' or 'online' accordingly
       if (snapshot.val() === 'online') activePlayers.push(player)
       return null // <-- IDE throws a fit otherwise lol
     })
  })
  console.log(activePlayers)
}

我期望发生的是:

offline
online
online
[userId1, userId2, userId3]

但真正发生的是:

[]
offline
online
online

我如何确保players.forEach(或players.filter)同步运行,即使内部有异步/promise逻辑(firebase查询)?

共有1个答案

裴楚青
2023-03-14

尝试使用下面的“异步/等待”。这将等待所有异步调用完成,然后前进到最后一个console.log

async function debugActivePlayers (players) {
  let activePlayers = []

  for (let player of players) {
    let snapshot = await firebase.ref('/status/' + player).once('value')
    console.log(snapshot.val()) // 'offline' or 'online' accordingly
    if (snapshot.val() === 'online') activePlayers.push(player)
    return null // <-- IDE throws a fit otherwise lol
  }

  console.log(activePlayers)
}

解释-"for... of"with"wait使得剩余语句的执行被搁置,直到所有promise都得到解决...为了证明这一点,请在下面进行测试

function getValue(p) { return Promise.resolve(p) } 

async function test (players = [1,2,3]) {

  for (let player of players) {
    console.log(await getValue(player))
  }

  console.log('done')
}

test()
 类似资料:
  • 我所拥有的 预期产出 实际产量 这只是一个例子。在我的真实代码中,我正在对我的全局状态(useContext, useReduer)执行删除操作。 是一个ID数组。

  • 问题内容: 这是不起作用的代码:演示:http : //jsfiddle.net/8dt94/63/ 问题答案: 您可以通过方法订购,因此可以使用toString方法

  • 这是我的对象(确保它是typeof对象): 为什么使用对我不起作用? .过滤器不是函数 建议的对象替代方案是什么?

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做

  • 我正在尝试编写一个Python代码,它打开一个csv文件,其中包含书籍、作者、流派等的列表,允许用户输入ISBN编号,并根据该编号显示与搜索匹配的结果。 csv文件有500行和7列,以逗号分隔。 这是我的密码。现在,代码只显示为输出:[1行x 7列]。但它应该显示与ISBN匹配的行的每个信息。