我正在开发一个小型纸牌游戏网页应用程序。我正在使用一个“房间”系统来容纳每个游戏及其玩家。每个房间都有一个玩家列表,我需要过滤这个列表,以便只获得在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查询)?
尝试使用下面的“异步/等待”。这将等待所有异步调用完成,然后前进到最后一个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匹配的行的每个信息。