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