首页 > 解决方案 > Firebase 实时数据库 - 在迭代数组时获取数据

问题描述

如何使用数组作为源从 Firebase 实时数据库中的多个节点获取数据?

由于同步调用,以下代码不起作用。

const myFunction= (snapshot) => {
  const dbRoot = snapshot.ref
  dbPaths = ['one', 'two']

  console.log('myFunction began')

  dbPaths.forEach((dbpath) => {
    const ref = dbRoot.child(dbpath)
    ref.orderByChild('name')
    .equalTo('Donald')
    .once('value', (removeSnapshot) => {
      const dataNode = removeSnapshot.val()
      console.log('myFunction dataNode', dataNode)
      //... logic
    })
  })

  console.log('myFunction finished')
}

输出将类似于以下内容

myFunction began
myFunction finished
myFunction dataNode {data:'somedata'}
myFunction dataNode {data:null}

如何在等待获取完成时迭代包含要获取的数据库路径的数组?

标签: javascriptfirebaseasynchronousfirebase-realtime-database

解决方案


一旦您说“等待[异步操作]完成”,请考虑“承诺”。

在这种情况下,由于您正在等待多个操作,因此您正在寻找Promise.all

const dbRoot = snapshot.ref
dbPaths = ['one', 'two']
let promises = [];

console.log('myFunction began')

dbPaths.forEach((dbpath) => {
  const ref = dbRoot.child(dbpath)
  promises.push(
    ref.orderByChild('name')
    .equalTo('Donald')
    .once('value', (removeSnapshot) => {
      return removeSnapshot.val()
    })
  );
})

Promise.all(promises).then((values) => {
  console.log(`All loading finished, all values are in ${values}`) 
})

推荐阅读