javascript - 异步函数内的循环内的承诺
问题描述
我正在使用 react 和 firebase 和 redux 开发一个项目,并且我有一些由用户创建的项目。我将用户的 id 存储在项目对象中,以便稍后在获取要显示的项目时填充用户。
现在我正在尝试获取项目并通过将用户 ID 替换为有关用户的实际信息来修改它们,但我有一个承诺问题。在我的代码中,我只得到一个空数组,这意味着在我返回最终结果之前修改没有得到解决。
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);
});
};
};
解决方案
我不完全了解您要做什么,但我建议您整理一下以使您的代码易于阅读和使用。
您可以使用它for of
来管理异步循环。我建议这样的事情,免责声明,我是在眼睛上做的,可能有一些错误,但你可以理解。
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 };
};
};
推荐阅读
- javascript - 使用 JavaScript 删除网站上所有客户端存储的数据
- python - ValueError:DataFrame 构造函数未正确调用- 拟合 SparsePCA 后
- python - 如何在pygame中使用两个输入获得正确的逻辑真值表结果,而不必在正确的时间按下两个输入
- javascript - React-google-chart 引发内容安全策略问题
- cordova - 科尔多瓦 ios 6.0.0 不显示启动画面图像
- aframe - 有没有办法在 A-Frame 项目中包含人脸跟踪?
- r - 如何在 R 中制作分组条形图?
- bash - 重击:使用 || 和 && 一起
- python - python程序中的目标路径
- json - PostgresSQL 中的 Jsonb 提取 - '{}' 的问题::