Firebase Firestore中的异步等待问题

时间:2020-01-29 09:10:43

标签: node.js firebase google-cloud-firestore

我试图立即在Firestore中获取文档和子集合数据。
然后我使用了异步并等待处理forEach循环。
它仍然有一些问题。 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 个答案:

答案 0 :(得分:1)

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

嘿,我更新了代码,因为Firebase似乎集成了它自己的foreach函数。然后,为了解决这个问题,我决定调用每个函数并存储将其返回到数组中的承诺,然后使用Promise.all来解析异步函数数组

答案 1 :(得分:0)

您正在forEach内部使用异步操作,该操作无法正常运行。您需要使用for..ofPromise.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;

您可能需要在这里和那里进行一些调整,但是您会有所想法。