【问题标题】:Using async/await in "forEach" and "for" in Dart [duplicate]在 Dart 的“forEach”和“for”中使用 async/await [重复]
【发布时间】:2021-12-23 15:38:11
【问题描述】:

我最近正在尝试做这样的事情,

注意:专注于打印语句。

  List shipped = [], pending = [], completed = [], returned = [];
  List<OrderModel> mainOrdersList = [];

  @override
  void initState() {
    super.initState();
    getData();
  }

  Future getData() async {
    var results = await DatabaseHandler().fetchOrders("merchantId");
    results.docs.forEach((f) async {
      var products = await DatabaseHandler().fetchOrderedProducts(f.id);
      var productData = products.data();
      //add to mainOrdersList
      print("mainOrderList Length - ${mainOrdersList.length}");
    });
    //THE BELOW STATEMENT IS BEING EXCECUTED BEFORE THE COMPLETION OF THE FOR LOOP GIVEN ABOVE
    segregate();
    setState(() {});
  }

  void segregate() {
    print("segregating");
    for (int i = 0; i < mainOrdersList.length; i++) {
      mainOrdersList[i].productList.forEach((element) {
        //segregate on the basis of status like pending, shipped, completed, returned
      });
    }
  }

使用 FOREACH 输出 -

segregating
mainOrdersList Length - 10

即使我在 forEach 中使用await,仍然首先执行 forEach 下面的语句。但是,如果我使用简单的 for 循环,则不会发生这种情况,并且代码可以正常运行。

forEach 替换为for

  for (int i = 0; i < results.docs.length; i++) {
      var f = results.docs[i].data();
      var products = await DatabaseHandler().fetchOrderedProducts(f.id);
      var productData = products.data();
      //add to mainOrdersList
      print("mainOrderList Length - ${mainOrdersList.length}");
    }

简单的输出 -

mainOrdersList Length - 10
segregating

我还观察到forEachfor 快一点。

【问题讨论】:

  • 我认为这是对您的问题的最佳解释。 stackoverflow.com/questions/63719374/…
  • 但是我观察到一件事,当我使用 forEach 时,列表的更新速度非常快,但现在使用正常的 for 循环后,这个过程变慢了。

标签: flutter dart


【解决方案1】:

默认 forEach 不是异步操作,你必须将其替换为:

await Future.forEach(elements, (element) async {
  await element.someThing();
});

【讨论】:

    【解决方案2】:

    尝试简单的登录。

    Future getData() async {
    bool isAsyncComplete = false; //add this line
        var results = await DatabaseHandler().fetchOrders("merchantId");
        results.docs.forEach((f) async {
          var products = await DatabaseHandler().fetchOrderedProducts(f.id);
          var productData = products.data();
          //add to mainOrdersList
          print("mainOrderList Length - ${mainOrdersList.length}");
          
          isAsyncComplete = true; //add this line
        
         });
        //THE BELOW STATEMENT IS BEING EXCECUTED BEFORE THE COMPLETION OF THE FOR LOOP GIVEN ABOVE 
         if(isAsyncComplete){. //add this line
             segregate();
             setState(() {});
         }
      
      }
    

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多