Javascript 异步函数内循环内的承诺
我正在使用react、firebase和redux进行一个项目,我有一些由用户创建的项目。我将用户的id存储在item对象中,以便稍后在获取要显示的项目时填充用户 现在,我试图通过将用户id替换为用户的实际信息来获取项目并对其进行修改,但我遇到了一个问题。在我的代码中,我只得到一个空数组,这意味着在返回最终结果之前,修改没有得到解决Javascript 异步函数内循环内的承诺,javascript,firebase,redux,google-cloud-firestore,Javascript,Firebase,Redux,Google Cloud Firestore,我正在使用react、firebase和redux进行一个项目,我有一些由用户创建的项目。我将用户的id存储在item对象中,以便稍后在获取要显示的项目时填充用户 现在,我试图通过将用户id替换为用户的实际信息来获取项目并对其进行修改,但我遇到了一个问题。在我的代码中,我只得到一个空数组,这意味着在返回最终结果之前,修改没有得到解决 export const getItems = () => { return (dispatch, getState, { getFirebase })
export const getItems = () => {
return (dispatch, getState, { getFirebase }) => {
const firestore = getFirebase().firestore();
const items = [];
const dbRef = firestore.collection('items').orderBy('createdAt', 'desc').limit(2);
return dbRef
.get()
.then((res) => {
const firstVisible = res.docs[0];
const lastVisible = res.docs[res.docs.length - 1];
async function getData(res) {
/////////////////////////////////////////////// how to finish this code befor jumping to the return line
await res.forEach((doc) => {
firestore
.collection('users')
.doc(doc.data().owner)
.get()
.then((res) => {
items.push({ ...doc.data(), owner: res.data() });
});
});
////////////////////////////////////////////////
return { docs: items, lastVisible, firstVisible };
}
return getData(res);
})
.catch((err) => {
console.log(err);
});
};
};
我不完全明白您想要做什么,但我建议您对代码进行一些排序,使其易于阅读和使用 您可以使用的来管理异步循环。我的建议是这样的,免责声明,我当时就这么做了,可能有一些错误,但你可以理解
const getAllDocs = function (data) {
let temp = [];
data.forEach(function (doc) {
temp.push(doc.data());
});
return { data: temp };
};
const getDoc = snap => (snap.exists ? { data: snap.data() } : {});
export const getItems = () => {
return async (dispatch, getState, { getFirebase }) => {
const firestore = getFirebase().firestore();
const dbRef = firestore.collection('items').orderBy('createdAt', 'desc').limit(2);
const usersRef = firestore.collection('users');
let temps = [];
const { data: items } = await dbRef.get().then(getAllDocs);
const firstVisible = items[0];
const lastVisible = items[items.length - 1];
for (const item of items) {
const { data: user } = await usersRef.doc(item.owner).get().then(getDoc);
const owner = {
/* whatever this means*/
};
temps.push({ ...user, owner });
}
return { docs: temps, lastVisible, firstVisible };
};
};
问题是,一系列承诺本身并不是一个承诺——因此等待它将是不可能的 如果您想异步加载它们,可以使用
Promise.all
解决这个问题
const items=wait Promise.all(res.map)(异步(doc)=>{
const res=await firestore.collection('users').doc(doc.data().owner.get());
返回{…doc.data(),所有者:res.data()};
});
否则,您可以像其他答案中建议的那样,在for循环中等待。首先,我的建议是使用for in或for of来使用承诺循环。我的第二个建议是或使用try and catch或使用then and catch。当您使用async and wait时,我应该使用try-catch来代替。非常感谢解决问题的人,没有我知道我需要实践承诺,以更好地处理它们