【问题标题】:Read a document from Firestore with id inside another document从 Firestore 中读取另一个文档中带有 id 的文档
【发布时间】:2021-02-16 19:14:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,问题出在 foreach() 上,即使在会话中用简单的 for 循环替换它也可以解决问题,Promise.all() 是一个更好的解决方案!谢谢!
    猜你喜欢
    • 2019-09-17
    • 2018-05-11
    • 2020-12-05
    • 1970-01-01
    • 2018-06-16
    • 2018-09-03
    • 1970-01-01
    • 2019-08-02
    相关资源
    最近更新 更多