javascript - firestore 从两个表中获取数据,一个接一个返回空数组

标签 javascript firebase google-cloud-firestore

我正在使用 firebase - firestore。我有类(class)和任务集合。 我想从类(class)集合中获取用户的所有类(class),并为每门类(class)从任务集合中获取天数数据,然后将所有这些数据保存在一个数组中。

  getData = () => {
    var arr = []
    f.auth().onAuthStateChanged(async (user) => {
       db.collection("courses")
        .where("uid", "==", user.uid)
        .get()
        .then((snapshot) => {

          var a = {};
          snapshot.forEach((doc) => {
            let coursesData =  doc.data()
            let courseName = coursesData.name;
            let kita = coursesData.kita;
            a = { name: courseName, id: doc.data().code, k: kita };
            let snapshotData = await db
              .collection("tasks")
              .where("uid", "==", user.uid)
              .where("name", "==", courseName)
              .where("kita", "==", kita)
              .get();

            let numActiveCourse = 0;
            snapshotData.forEach((dc) => {
              let taskData =  dc.data()
              console.log('taskData',taskData)
              let days = taskData.days;
              if (days > 0) {
                numActiveCourse = 1;
              }
            });

            a = { ...a, numActiveCourse };
            arr.push(a);
            console.log("arr2 is", arr);
          });
        })
        .catch((e) => {
          console.log("error is courses", e);
        });
        this.setState({data:arr})

    });

  };

问题是 arr 总是空的(我想我有异步问题) 快照完成后不会等待。

最佳答案

我找到了解决方案。 问题是因为我试图让 async await 进入 forEach 并且它不等待回答。 解决方案是

 readCourses = async()=>{
f.auth().onAuthStateChanged(async (user) => {
  let loadedPosts = {};
  let docSnaps = await db.collection("courses").where("uid", "==", user.uid).get();
  for (let doc of docSnaps.docs){

    let courseName = doc.data().name;
    let kita = doc.data().kita
    loadedPosts[doc.id] = {
      ...doc.data(),
      k:kita,
      id:doc.data().code
    }
    const taskSnap =  await db
      .collection("tasks")
      .where("uid", "==", user.uid)
      .where("name", "==", courseName)
      .where("kita", "==", kita)
      .get()

    let numActiveCourse = 0
    for(let task of taskSnap.docs){
      let taskData = task.data()
      if(taskData.days>0){
        numActiveCourse =numActiveCourse+1
      }

    }
    loadedPosts[doc.id].numActiveCourse = numActiveCourse
  }
  console.log('loadedPosts',loadedPosts)
  this.setState({data:loadedPosts})

})

如果您有任何其他解决方案,我希望看到。

关于javascript - firestore 从两个表中获取数据,一个接一个返回空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62162227/

相关文章:

javascript - 如何将系列添加到特定索引处的柱形图

Javascript 代码仅在 FireFox 中在 try-catch block 中失败

javascript - 向下滚动然后向上滚动时如何隐藏div

javascript - 在 Javascript 中检查结果时如何修复 'undefined' 对象?

带有 Firebase 的 Android 架构组件,特别是 Firestore

javascript - 如何测试 Angular Directive(指令)范围

javascript - 使用 AngularJS 过滤 Firebase 数据

javascript - 在客户端(即在 javascript 中)检查 firebase db ref 的正确方法是什么?

javascript - Firestore 云功能 |基于时间字段的触发事件等于

go - Firestore docRef.Collections(ctx) 的读/写成本是多少?