【问题标题】:Await async function in for in loop在 for in 循环中等待异步函数
【发布时间】:2021-11-13 18:41:27
【问题描述】:

我有一个双重“for in”循环,我需要扫描第一个汽车品牌和所有驾驶风格,然后下载我有用户投票的文档数量。 所以代码应该扫描一种驾驶风格,例如“运动”,并为每个人获取 firebase 中的文档数量(投票数)。

这是我的代码:

List<String> brands = [
'ferrari',
'porshe',
'lamborgini',
'bugatti',
'bentley',
];

List<String> drivingStyles = [
'sport',
'comfort',
'offroad',
];

    Future getVotes(String brand, String drivingStyle) async {
try {
  for (String brand in brands) {
    for (String drivingStyle in drivingStyles) {
      var query = FirebaseFirestore.instance
          .collection('survey')
          .doc('car_survey')
          .collection('summer')
          .where('brand', isEqualTo: brand)
          .where('drivingStyle', isEqualTo: drivingStyle);
      var querySnapshot = await query.get();
      var numberOfVotes = querySnapshot.docs.length;
      
      print('brand: $brand, drivingStyle: $drivingStyle');
       //print('$numberOfVotes');

    }
  }

} catch (e) {
  print('getVotes ERROR: $e');
}

当我只打印品牌名称和驾驶风格(for in 循环的结果)时,它看起来很完美,如下所示:

I/flutter ( 4723): brand: ferrari, drivingStyle: sport
I/flutter ( 4723): brand: ferrari, drivingStyle: comfort
I/flutter ( 4723): brand: ferrari, drivingStyle: offroad|
etc... 

这正是我所期望的, 但是在激活await query.get() 之后,我得到了一个汽车品牌的一种驾驶风格,直到汽车品牌风格结束,然后通过所有汽车品牌再次获得下一种驾驶风格——这与我需要的相反,我不明白为什么激活await query.get() 后会发生变化。我基本上收到了这个:

I/flutter (12137): brand: ferrari, drivingStyle: sport
I/flutter (12137): brand: porshe, drivingStyle: sport
I/flutter (12137): brand: lamborghini, drivingStyle: sport
I/flutter (12137): brand: bugatti, drivingStyle: sport
I/flutter (12137): brand: bentley, drivingStyle: sport

I/flutter (12137): brand: ferrari, drivingStyle: comfort
I/flutter (12137): brand: porshe, drivingStyle: comfort
etc...

我需要读取一个品牌所有驾驶风格的值,然后将其保存为值。

似乎我在 for in 循环中等待 Future 时遇到问题。你能看看并告诉我我做错了什么吗?

非常感谢。

【问题讨论】:

  • 您的代码看起来不错。在您包含您的 firebase 功能并在哪里打印 numberOfVotes 后,我们可以看到 getVotes
  • 嗨@PeterO。并感谢您的意见。我刚刚更新了问题。
  • 我刚刚运行了你的函数,我注意到了一些东西。传递给getVotes 函数的值正在由for 语句更新。这是预期的行动吗?那可能是错误的来源吗?因为我在没有将任何参数传递给getVotes 的情况下运行了您的代码并且它按预期工作。
  • 您是指从外部传递给getVotes 的值branddrivingStyle?它们是如何通过 for 语句更新的?没有任何意图。基于这些值,我只需要读取集合中有多少票(querySnapshot.docs.length),所以当 Firestore 路径发生变化时,我得到的数字(int)正在被进一步处理......

标签: firebase flutter google-cloud-firestore async-await


【解决方案1】:

试试这个

    List<String> brands = [];
    List<String> drivingStyles = [];
    for (String brand in brands) {
      await Future.forEach(drivingStyles, (String drivingStyle) async {
        var query = FirebaseFirestore.instance
            .collection('survey')
            .doc('car_survey')
            .collection('summer')
            .where('brand', isEqualTo: brand)
            .where('drivingStyle', isEqualTo: drivingStyle);
        var querySnapshot = await query.get();
        var numberOfVotes = querySnapshot.docs.length;
      });
    }

【讨论】:

  • 不幸的是,这并不能解决任何问题。结果与我的代码中激活的await query.get() 函数相同,即使异步函数处于非活动状态。
  • 你会明白你是否会收到未来的价值输出。您正在根据非异步值的打印值调试代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2019-07-02
  • 2021-09-09
  • 1970-01-01
  • 2021-10-18
  • 2018-09-25
相关资源
最近更新 更多