我试图立即在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;
})
您在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;
您可能需要在这里和那里进行一些调整,但是您会有所想法。
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