Javascript 一旦检索到所有数据,如何解析内部带有foreach循环的嵌套承诺?
我有一个很大的承诺,在我的功能和内部我做了2个电话。第一个从组织中获取成员的。然后我对它进行迭代,获取每个成员的详细信息并将其填充到数组中。我只想在最后解决,一旦我有了每个成员的详细数据。我通过比较两个数组的长度来实现这一点。下面的代码是有效的,但是我怎样才能拆分它或以更好的方式编写它呢Javascript 一旦检索到所有数据,如何解析内部带有foreach循环的嵌套承诺?,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我有一个很大的承诺,在我的功能和内部我做了2个电话。第一个从组织中获取成员的。然后我对它进行迭代,获取每个成员的详细信息并将其填充到数组中。我只想在最后解决,一旦我有了每个成员的详细数据。我通过比较两个数组的长度来实现这一点。下面的代码是有效的,但是我怎样才能拆分它或以更好的方式编写它呢 export const getTeamMembers = (firebaseContext, user) => { const { activeOrganization } = user; r
export const getTeamMembers = (firebaseContext, user) => {
const { activeOrganization } = user;
return new Promise((resolve, reject) => {
firebaseContext.db
.collection("organizations")
.doc(activeOrganization)
.get()
.then((snapshot) => {
if (!snapshot.empty) {
const members = snapshot.data().members;
const memberProfiles = [];
members.forEach((m) => {
firebaseContext.db
.collection("users")
.doc(m.uid)
.get()
.then((snapshot) => {
const profile = snapshot.data();
memberProfiles.push(profile);
console.log("person added");
console.log(memberProfiles);
if (members.length === memberProfiles.length) {
resolve(memberProfiles);
}
})
.catch((err) => reject(err));
});
} else {
reject([]);
}
})
.catch((err) => reject(err));
});
};
你可以试试这个 在声明
const memberProfiles=[]之后;
我建议使用
async/await
语法来清理这个问题。此外,您还可以将代码映射到一系列承诺,并等待所有承诺,而不是在每个承诺中执行检查:
export const getTeamMembers = async (firebaseContext, user) => {
try {
const { activeOrganization } = user;
const snapshot = firebaseContext.db
.collection("organizations")
.doc(activeOrganization)
.get();
const members = snapshot.data().members;
const memberPromises = members.map(m => {
return firebaseContext.db
.collection("users")
.doc(m.uid)
.get();
});
return (await Promise.all(memberPromises)).map(s => s.data());
} catch (e) {
// throw some error to cause promise to reject
}
};
export const getTeamMembers = async (firebaseContext, user) => {
try {
const { activeOrganization } = user;
const snapshot = firebaseContext.db
.collection("organizations")
.doc(activeOrganization)
.get();
const members = snapshot.data().members;
const memberPromises = members.map(m => {
return firebaseContext.db
.collection("users")
.doc(m.uid)
.get();
});
return (await Promise.all(memberPromises)).map(s => s.data());
} catch (e) {
// throw some error to cause promise to reject
}
};