从 Firestore 中读取另一个文档中带有 id 的文档

时间:2021-02-16 19:14:49

标签: firebase flutter google-cloud-firestore

我有一个名为会话的集合,在每个会话中都有一个教练 ID,它是用户文档的文档 ID。我正在尝试读取所有会话,然后对于每个会话我想获取用户文档,教练列表(用户)将 bloc 留空,我认为这是异步任务的问题。

      List<Session> sessions;
      List<MyUser> coaches;
      yield AdminsessionsLoading();
      await datasource
          .fetchMonthSessions(event.month, event.year)
          .then((data) async => {
                sessions = data,
                data.forEach((session) async => {
                      await adminDatasource
                          .fetchUser(session.coachId)
                          .then((coach) => coaches.add(coach))
                    })
              });
      //after fetching sessiosn, fetch the coaches

      print(coaches);
      print("Sessions Fetched " +
          " - Sessions : " +
          sessions.length.toString() +
          " - Coaches : " +
          coaches.length.toString());

      yield AdminsessionsLoaded(sessions: sessions, coaches: coaches);
    }

我以正确的方式阅读教练和课程的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

.forEach() 没有返回值,你不能等待它——所以当你的代码产生多个异步任务时,它不会等待它们中的任何一个。你可以使用

await Promise.all(
               data.map((session) async => {
                      await adminDatasource
                          .fetchUser(session.coachId)
                          .then((coach) => coaches.add(coach))
                    })
              });
         );

等待所有完成(.map() 将返回一组承诺)。这是异步代码中 .forEach() 的巨大限制。