我想使用Forach处理Firebase获得的值。 为了顺序处理,使用了异步,等待。
const sleep = time => new Promise(resolve => setTimeout(resolve, time));
async function () {
var snapshot = await firebase.database().ref("/path/").once("value")
snapshot.forEach(async function (childSnapshot) {
await sleep(1000)
console.log(snapshot.val)
})
}
但是,结果仅处理了第一项中的第一项。 也就是说,Foreach无法正常工作。 如果删除异步,则Foreach将起作用。 我们如何使它们兼容?
答案 0 :(得分:3)
您将无法使用forEach,因为它需要您传递一个函数,并且也不会使用它返回的promise(这始终是异步函数返回的内容)。而是将数据库子节点转换为数组,并使用for / of对其进行迭代:
async function () {
const snapshot = await firebase.database().ref("/path/").once("value")
const array = []
snapshot.forEach(child => array.push(child))
for (const child of array) {
await sleep(1000)
console.log(snapshot.val)
}
}
还请注意,Firebase返回的快照不是数组,不能直接使用for / of进行迭代。它的forEach方法是其自己的特殊子节点迭代器。
答案 1 :(得分:1)
我遇到了类似的问题,其中array.push(child)仅执行一次。因此,添加到Doug的解决方案中,我们需要执行以下操作,以使forEach循环在完成整个过程之前不会退出:
async function () {
const snapshot = await firebase.database().ref("/path/").once("value")
const array = []
snapshot.forEach((child: any) => {
array.push(child)
return false
})
for (const child of array) {
await sleep(1000)
console.log(snapshot.val)
}
}