Как я могу сопоставить массив Firestore DocumentReferences с массивом DocumentData? - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь создать облачную функцию Google, которая читает коллекцию документов Firestore и выполняет действие с этими документами.Эти документы должны быть прочитаны один раз и сохранены в массиве для сокращения необходимых операций чтения.Но я не могу сделать это правильно, чтобы итерация по моему массиву начиналась после окончания чтения.

export const matchUsers = functions
  .region("europe-west1")
  .pubsub
  .topic("matchUsers")
  .onPublish(async message => {
    console.log("Matching invoked...")

    await firebase.firestore().collection("matchData").listDocuments().then(docRefs => {
      const docs: admin.firestore.DocumentData[] = []

      docRefs.forEach(async docRef => {
        await docRef.get().then(snapshot => {
          const data = snapshot.data()
          if (data) {
            console.log("BPM: " + data.bpm)   # gets called
            docs.push(data)
          }
        })
      })

      console.log("Start loop")
      docs.forEach(doc => {
        console.log("BPM: " + doc.bpm)   # never gets called
      })
      console.log("Finish loop")

    })

  });

Вывод:

Matching invoked...
Start loop
Finish loop
BPM: 120

Я ожидаю, что вывод будет таким: Вывод:

Matching invoked...
BPM: 120
Start loop
BPM: 120
Finish loop

1 Ответ

0 голосов
/ 08 июня 2019

Попробуйте это:

export const matchUsers = functions
  .region("europe-west1")
  .pubsub
  .topic("matchUsers")
  .onPublish(async message => {
    console.log("Matching invoked...")

    await firebase.firestore().collection("matchData").get().then(docRefs => {
      const docs: admin.firestore.DocumentData[] = []

      docRefs.forEach(docRef => {
        const data = docRef.data()
        console.log("BPM: " + data.bpm)   # gets called
        docs.push(data)
      })

      console.log("Start loop")
      docs.forEach(doc => {
        console.log("BPM: " + doc.bpm)
      })
      console.log("Finish loop")
    })

  });

Похоже, вы смешиваете асинхронные операции с синхронизацией, и это не работает так, как вы ожидаете, также get() это достаточно для случая.

Наконец, обратите внимание на тайм-аут, если ваша коллекция большая.

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...