如何在 firestore 快照中获取多个引用

How to get multiple references in a firestore snapshot

我有一个包含 post 个文档的 firestore 集合,每个文档都包含对作者(用户)和案例文档的引用。

如何在同一个 onSnapshot 中获取用户和案例?

这是我想用 await 做的事情,但这似乎不是 react-native-firebase 的一个选项。

export const firebasePostLooper = (snapshot) => {
  let data = [];

  snapshot.forEach(async (doc) => {
    let newItem = {id: doc.id, ...doc.data()};
    if (newItem.author) {
      let authorData = await getDoc(newItem.author); // doesn't work with rnfirebase
      if (authorData.exists()) {
        newItem.userData = {userID: authorData.id, ...authorData.data()};
      }
    }
    if (newItem.case) {
      let caseData = await getDoc(newItem.case);
      if (caseData.exists()) {
        newItem.userData = {userID: caseData.id, ...caseData.data()};
      }
    }
    data.push(newItem);
  });
  return data;
};

这不起作用,因为 getDoc() 不存在。

所以我只剩下使用 .then()


export const firebasePostLooper = (snapshot) => {
  let data = [];

  snapshot.forEach((doc) => {
    let newItem = {id: doc.id, ...doc.data()};

    if (newItem.author) {
      newItem.author
        .get()
        .then((res) => {
          newItem.authorData = res.data();
          if (newItem.case) {
            newItem.case
              .get()
              .then((caseRes) => {
                newItem.caseData = caseRes.data();
                data.push(newItem);
              })
              .catch((err) => console.error(err));
          }
        })
        .catch((err) => console.error(err));
    } else {
      data.push(newItem);
    }
  });
  return data;
};

第二种方法似乎不起作用,return 语句中的数据为空,但 data.push(newItem) 包含带有 2 个引用文档的正确文档。

您正在 returning 数据,然后它才被填充到 promise 中。您应该在 .then() 中处理 returning 数据,以便 return 在 promise 解决之后而不是之前。

看看这个例子,如果我们在 promise 链之外处理 emptyData 对象,我们只是 return 它被填充之前的初始值。

let promise = new Promise((resolve, reject)=>{
setTimeout(resolve, 1000, 'foo');
})

let emptyData= [];
let notEmptyData = [];

promise
.then(res=>{
    emptyData.push(res);
  notEmptyData.push(res);
    console.log("Full data: " + notEmptyData) // "Full data: foo"
});



console.log("Empty data: " + emptyData); // "Empty data: "