asyn c жду вопроса в Firebase Firestore - PullRequest
1 голос
/ 29 января 2020

Я попытался сразу получить документ и данные подколлекции в firestore.
И я использовал asyn c и жду, чтобы разобраться с forEach l oop.
У него все еще есть некоторые проблемы. Console.log 4 всегда выполняется первым.

Но что я ожидаю, должно быть 1 -> 2 -> 3 -> 4.
Может ли кто-нибудь помочь мне, как изменить мой код?

let data = {};

toolboxesRef.get()
.then(async snapshot => {
  let toolboxes = [];
  // get toolbox
  await snapshot.forEach(async doc => {
    let toolbox = {};
    await toolboxesRef.doc(doc.id).collection('tags').get()
    .then(snapshot => {
      let tags = []
      snapshot.forEach(doc => {
        tags.push(doc.id);
        console.log(1)
      })
      toolbox.tags = tags;
      toolbox.id = doc.id;
      toolbox.data = doc.data(); 
      console.log(2)
    })
    console.log(3)
    toolboxes.push(toolbox)
  })
  console.log(4);
  data.toolboxes = toolboxes
  return data;
})

Ответы [ 2 ]

1 голос
/ 29 января 2020

export const asyncForEach = async (dataSnapshot, callback) => {
    const toWait = [];
    dataSnapshot.forEach(childSnapshot => {
        toWait.push(childFunction((childSnapshot)));
    });
    await Promise.all(toWait);
};

Привет, я обновил код, потому что кажется, что Firebase интегрирует свою собственную функцию foreach. Затем, чтобы решить, я решил вызвать каждую функцию и сохранить обещание, что она вернется в массив, тогда я использую Promise.all для разрешения массива асин c функция

0 голосов
/ 29 января 2020

Вы используете asyn c операции внутри forEach, которые не работают так, как вы ожидаете. Вам нужно либо использовать for..of, либо Promise.all. Попробуйте эту версию

const snapshot = await toolboxesRef.get();
const toolboxes = [];
for(const doc of snapshot) {
  const toolbox = {};
  const snapshot1 = await toolboxesRef.doc(doc.id).collection("tags").get();
  const tags = [];
  snapshot1.forEach(doc => {
    tags.push(doc.id);
    console.log(1);
  });
  toolbox.tags = tags;
  toolbox.id = doc.id;
  toolbox.data = doc.data();
  console.log(2);
  console.log(3);
  toolboxes.push(toolbox);
}
console.log(4);
data.toolboxes = toolboxes;
return data;

Возможно, вам придется немного кое-что настроить, но у вас возникнет идея.

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