找到 CollectionGroup 时获取 fullData

Thắ*_*hắc 5 javascript firebase react-native google-cloud-firestore

我在查询 1 个集合 User-> UidUser-> InfoUser (POST (Collection), name, age ...) 中的所有数据时遇到问题

然后我使用下面的代码来获取 collectionsGroup (Post) 但是如何获取用户的姓名和年龄?

当我使用 2 个嵌套循环时,另一个问题是 forEach 不能在里面使用 Await 和 Async 使我丢失数据。

  getData = async () => {

        await firebase.firestore().collection('user').doc(Fire.shared.uid).onSnapshot(documentSnapshot => {

            firebase.firestore().collectionGroup('Post').where('uid', 'in', 
                documentSnapshot.data().Followings).get().then(querySnapshot => {

                const Post = [];
                  querySnapshot.forEach(post => {


                    Post.push({ data: post.data() }) // This is correct and get full data's Post


                });
                this.setState({ dataPost: Post })
            })
        })
}

Run Code Online (Sandbox Code Playgroud)
await firebase.firestore().collection('user').doc(Fire.shared.uid).onSnapshot(documentSnapshot => {

            firebase.firestore().collectionGroup('Post').where('uid', 'in', documentSnapshot.data().Followings).get().then(querySnapshot => {

                const Post = [];

                querySnapshot.forEach(async (post) => {
                    // Incorrect because forEach don't wait callback => Lose a documents's user //
               
                   await firebase.firestore().collection('user').doc(post.data().id).onSnapshot(user => {

                    Post.push({ data: post.data(),user: documentSnapshot.data() })

                    })
                });
                this.setState({ dataPost: Post })
            })
        })
Run Code Online (Sandbox Code Playgroud)

Bas*_*ran 2

我认为 Promise.all 可以解决这个问题

firebase.firestore()
.collection("user")
.doc(Fire.shared.uid)
.onSnapshot((documentSnapshot) => {
  firebase
    .firestore()
    .collectionGroup("Post")
    .where("uid", "in", documentSnapshot.data().Followings)
    .get()
    .then((querySnapshot) => {
      const Post = [];

        querySnapshot.forEach((post) => {
            Post.push(new Promise((resolve, reject) => {
                firebase
                .firestore()
                .collection("user")
                .doc(post.data().id)
                .onSnapshot((user) => {
                  resolve({ data: post.data(), user: documentSnapshot.data() });
                });
          }))
       
      });
        Promise.all(Post).then(res => {
          console.log(res)
        this.setState({ dataPost: res})

     })
    });
});
Run Code Online (Sandbox Code Playgroud)

我通过一个带有 setTimeout 函数和 forEach 函数的简单示例展示了它是如何工作的,也许它可以帮助其他人在面临此类问题时

firebase.firestore()
.collection("user")
.doc(Fire.shared.uid)
.onSnapshot((documentSnapshot) => {
  firebase
    .firestore()
    .collectionGroup("Post")
    .where("uid", "in", documentSnapshot.data().Followings)
    .get()
    .then((querySnapshot) => {
      const Post = [];

        querySnapshot.forEach((post) => {
            Post.push(new Promise((resolve, reject) => {
                firebase
                .firestore()
                .collection("user")
                .doc(post.data().id)
                .onSnapshot((user) => {
                  resolve({ data: post.data(), user: documentSnapshot.data() });
                });
          }))
       
      });
        Promise.all(Post).then(res => {
          console.log(res)
        this.setState({ dataPost: res})

     })
    });
});
Run Code Online (Sandbox Code Playgroud)

async function call() {
  const nums = [1, 2, 3, 4, 5];
  const promises = [];
  nums.forEach((res) => {
    setTimeout(() => {
      promises.push(res*2);
    }, 10000);
  });
  console.log(promises);
}
call();
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,输出是一个空数组,因此我找到了解决此问题的方法

async function call() {
  const nums = [1, 2, 3, 4, 5];
  const promises = [];
  nums.forEach((res) => {
    setTimeout(() => {
      promises.push(res*2);
    }, 10000);
  });

  Promise.all(promises).then((res) => {
    console.log("res", res);
  });
}
call();
Run Code Online (Sandbox Code Playgroud)