无法使用async和Foreach处理Firebase获取的值

时间:2019-02-28 01:19:48

标签: javascript firebase firebase-realtime-database foreach async-await

我想使用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将起作用。 我们如何使它们兼容?

2 个答案:

答案 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)
    }
 }