在foreach完成之前发送响应

问题描述 投票:0回答:1

im试图获取一个带有其子集合的firestore集合。为此,我编写了一个Firestore云功能。但是当我发送请求时,即时通讯返回了一个空数组。发送响应后,控制台日志将显示数据。

有人可以向我解释我在做什么错吗?

而且我知道,如果有人对如何获取数据有更好的了解,那么代码不是最佳实践。希望能听到。

谢谢


export const helloWorld = functions.https.onRequest((request, response) => {
  cors(request, response,() => {
    getProfiles()
      .then((data) => {
        console.log(data)
        response.send(data)
      })
      .catch((err) => {
        console.log(err)
      })
  })
})

const getProfiles = async (): Promise<any[]> => {
  const allTrainers: any[] = []
  const trainerProfiles = await db.collection('consultant_profiles').get()

  trainerProfiles.forEach(async (snapshot: DocumentSnapshot) => {
    const profile = snapshot.data()

    if (profile) {
      profile['.key'] = snapshot.id
    }

    const trainerPackets = await db
      .collection('consultant_profiles')
      .doc(snapshot.id)
      .collection('consultant_packets')
      .orderBy('price', 'asc')
      .get()

    const packets: any[] = []
    trainerPackets.forEach((packet: DocumentSnapshot) => {
      packets.push(packet.data())
    })

    const trainerReviews = await db
      .collection('consultant_profiles')
      .doc(snapshot.id)
      .collection('consultant_reviews')
      .get()

    const reviews: any[] = []
    trainerReviews.forEach((review: DocumentSnapshot) => {
      reviews.push(review.data())
    })

    allTrainers.push(profile, packets, reviews)

    console.log(profile, packets, reviews)
  })

  return allTrainers
}



[]
9:21:44.586 PM
helloWorld
Function execution took 2717 ms, finished with status code: 200
9:21:44.889 PM
helloWorld
[]
9:21:44.893 PM
helloWorld
Function execution took 1291 ms, finished with status code: 200
9:21:49.268 PM
helloWorld
{ updatedAt: Timestamp { _seconds: 1568747857, _nanoseconds: 790000000 }, first_name: 'Torben', services: [ 'nutrition', 'fitness', 'health' ], description: 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.', image_url: 'https://www.fillmurray.com/360/360', last_name: 'Müller', '.key': 'VajLDpnbNPPJ3WjR0tKRBZ8bKX63' } [ { userId: 'VajLDpnbNPPJ3WjR0tKRBZ8bKX63', description: 'Drittes Paket ALL INC', price: 89, createdAt: Timestamp { _seconds: 1568747856, _nanoseconds: 878000000 } } ] []
typescript firebase async-await google-cloud-functions nuxt
1个回答
1
投票

您需要将forEach语句包装为Promise.all,如下所示:

...

await Promise.all(trainerProfiles.forEach(async (snapshot: DocumentSnapshot) => {
    ...
}))

return allTrainers

希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.