如何解决所有数据检索完毕后,里面有foreach循环的嵌套承诺?

问题描述 投票:0回答:2

我的函数中有一个大的承诺,里面有两个调用。第一个调用是从组织中获取成员。然后我对其进行迭代,并为每个成员获取详细信息+将其填充到一个数组中。我只想在最后解决,一旦我有每个成员的细节数据。我通过比较两个数组的长度来实现。下面的代码可以工作,但我如何将其拆分或以更好的方式编写?

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));
  });
};
javascript promise es6-promise
2个回答
1
投票

我建议使用 async/await 语法来清理这个问题。此外,你可以将你的代码映射到一个承诺数组和 await 所有的,而不是分批进行检查。forEach:

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
  }
};

0
投票

也许你可以试试这个

宣告后 const memberProfiles = [];

 let membersPromises = [];
members.forEach((m) => { 

membersPromises.push(firebaseContext.db .collection("users") .doc(m.uid) .get());

Promise.all(membersPromises).then(profiles=>{

profiles.forEach(profile=>{

memberProfiles.push(profile.data());

});


resolve(memberProfiles);
}).catch((err) => reject(err)); });
© www.soinside.com 2019 - 2024. All rights reserved.