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

zen*_*zen 1 javascript foreach async-await firebase firebase-realtime-database

我想用 Forach 处理 Firebase 获得的值。为了按顺序处理,使用了 async、await。

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)
   })
 }
Run Code Online (Sandbox Code Playgroud)

然而,结果只有第一项的第一项被处理。也就是说,Foreach 不起作用。如果您删除 async、await,Foreach 将起作用。我们怎样才能让它们兼容?

Dou*_*son 7

您将无法使用 forEach,因为它要求您传递一个函数,并且它不会使用它返回的承诺(这始终是异步函数返回的内容)。相反,将数据库子节点转换为数组并使用 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

另请注意,Firebase 返回的快照不是数组,不能直接使用 for/of 进行迭代。它的 forEach 方法是它自己特殊的子节点迭代器。