firestore 查询等待嵌套的 foreach 循环

firestore query wait for nested foreach loop

我试图用一个集合中所有文档的名称填充一个数组,并用这些父文档中的所有子集合文档填充另一个数组。

  let data = []
  let names = []
  
  const suppliers = await db.collection('suppliers').get()
  
  suppliers.forEach(async supplier => {

    names.push({name: supplier.data().name, id: supplier.id })

    const deliveries = await db.collection('suppliers').doc(supplier.id).collection('deliveries').get()
    
    deliveries.forEach(delivery => {
      
      data.push(delivery.data())
    })
  })

  console.log(names) // Populated
  console.log(data) // Empty

问题是它没有等到内部循环结束才执行外部代码。 names 数组被填充,但 data 数组为空。如何在执行外部代码之前完成嵌套循环?

Foreach 不支持异步回调。为了摆脱这个你可以使用。

let data = [];
let names = [];
suppliers.then(async(supplier) => {
    names.push({name: supplier.data().name, id: supplier.id })
    const deliveries = await db.collection('suppliers')                                            
                               .doc(supplier.id)
                               .collection('deliveries')
                               .get()
    
    deliveries.forEach(delivery => {
      data.push(delivery.data())
    })
  })

加载供应商的交货是一个异步操作。由于您正在加载所有供应商的交货并且只想在所有供应商都加载后进行记录,因此您需要等待多个异步操作,这需要使用 Promise.all:

let data = []
let names = []

const suppliers = await db.collection('suppliers').get()

const promises = suppliers.docs.map(supplier => {

  names.push({name: supplier.data().name, id: supplier.id })

  return db.collection('suppliers').doc(supplier.id).collection('deliveries').get()    
})

const allDeliveries = await Promise.all(promises)
allDeliveries.forEach((deliveries) => {
  deliveries.forEach(delivery => {      
    data.push(delivery.data())
  })
})

console.log(names)
console.log(data)