Firebase Firestore中的异步等待问题

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

我试图立即在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;
})
node.js firebase google-cloud-firestore
2个回答
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;

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


0
投票

async function getToolboxes() {
  const data = {};
  let toolboxes = [];
  
  const snapOfToolBoxes = await toolboxesRef.get();
  
  for(const docOfTool of snapOfToolBoxes) {
    let toolbox = {};
    
    const snapOfTags = await toolboxesRef.doc(docOfTool.id).collection('tags').get();
    
    const tags = snapOfTags.map(doc => doc.id);
    
    toolbox.tags = tags;
    toolbox.id = docOfTool.id;
    toolbox.data = docOfTool.data(); 
    
    toolboxes.push(toolbox);
  }
  
  data.toolboxes = toolboxes;
  return data;
}

为了避免forEach问题,您可以使用for of

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