【问题标题】:Flutter Await not waiting颤振等待不等待
【发布时间】:2020-10-25 07:41:54
【问题描述】:

为什么程序在执行打印语句之前不等待函数返回列表?

我认为这是因为我将 forEach 循环设为异步,但我需要将其设为异步以获取作为 Future 的 newSummary。

Future syncToCloud() async{
  final List<Map<String,dynamic>> _events = await events();
  print(_events.length);
}
  
  
Future<List<Map<String, dynamic>>> events() async {
  List<Map<String, dynamic>> maps = await db.query('data');
  List<Map<String, dynamic>> newMaps=[];

  maps.forEach((element)async{
    Map<String, dynamic> newElement = {};

    if(element['summary']!=''){
      newElement['summary'] = await newSummary(element['summary']);
      print(newElement['summary']);
    }
    else{
      newElement['summary'] = element['summary'];
    }
    newMaps.add(newElement);
  });
  
    return newMaps;
}
  

void main()async{
  await syncToCloud();
}

【问题讨论】:

    标签: flutter asynchronous dart async-await


    【解决方案1】:

    请替换以下内容

      maps.forEach((element)async{
        Map<String, dynamic> newElement = {};
    
        if(element['summary']!=''){
          newElement['summary'] = await newSummary(element['summary']);
          print(newElement['summary']);
        }
        else{
          newElement['summary'] = element['summary'];
        }
        newMaps.add(newElement);
      });
    

    有了这个

      await Future.wait(  maps.forEach((element)async{
        Map<String, dynamic> newElement = {};
    
        if(element['summary']!=''){
          newElement['summary'] = await newSummary(element['summary']);
          print(newElement['summary']);
        }
        else{
          newElement['summary'] = element['summary'];
        }
        newMaps.add(newElement);
      }));
    

    【讨论】:

    • 这也有效!但是将 forEach 更改为 for 循环也可以,而且时间会短一些。
    • 使用这个确切的代码会抛出这个错误:'这个表达式的类型是'void',所以它的值不能被使用。'对于forEachList
    【解决方案2】:

    你在一个不起作用的回调中执行你的return [{'hi':5}]。您应该等待 Future.delayed 然后像这样返回列表await Future.delayed(Duration(seconds: 2));

    Future syncToCloud() async{
      final List<Map<String,dynamic>> _events = await events();
      print(_events.length);
    }
      
      
    Future<List<Map<String, dynamic>>> events() async {
      await Future.delayed(Duration(seconds: 2));
      return [{'hi':5}];
    }
      
    
    void main()async{
      await syncToCloud();
    }
    

    【讨论】:

    • 是的,抱歉,这只是一个最小的可重现示例,我犯了一个错误。让我编辑帖子并添加实际代码
    • 好的,当然。我等着
    • 你试过用For循环代替forEach吗?
    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 2020-09-01
    • 2023-04-07
    • 2019-05-07
    • 2021-03-11
    • 2021-04-23
    • 2020-02-16
    • 2021-03-28
    相关资源
    最近更新 更多