asynchronous - Flutter 异步代码中错误的执行顺序

标签 asynchronous flutter dart future

我在 Flutter 应用程序中遇到 future 问题。

void saveCats() async {
  var cats = await convertToCats(_rawData);
  await DatabaseProvider.db.addCats(cats);
}

Future<List<Cat>> convertToCats(CatList catData) async {
  var cats = <Cat>[];
  await catData.forEach(key, value) async {
    var pos = await calculatePos();
    print('This should come first');
    cats.add(Cat(name: key, pos: pos);
  }
}

Future<int> calculatePos() async {
  return await DatabaseProvider.db.calculatePos();
}

数据库.dart:

Future<void> addCats(List<Cat> cats) async {
  print('This should come second');
  // Do adding stuff here
}

Future<int> calculatePos() async {
  // Some code to calculate the position
  return pos;
}

在上面的代码中,saveCats 函数在点击按钮时被调用。此函数将一些原始数据转换为 Cat 模型列表,并将它们添加到数据库中。作为此转换过程的一部分,它会计算列表中猫的 pos。我的问题是,我希望在我的两个 print 语句中,forEach 循环中的那个应该在 addCats 中的那个之前数据库功能。但相反,它们以相反的顺序出现。我哪里错了?

最佳答案

您不能在 List.forEach() 或 Map.forEach() 中async/await,因为它们都返回 void。 要么使用

await Future.forEach([1, 2, 3], (num) async {
    await asyncMethod(num);
  });

或类似的东西; https://api.flutter.dev/flutter/dart-async/Future/forEach.html

关于asynchronous - Flutter 异步代码中错误的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57358546/

相关文章:

android - Flutter VSCode:调试错误:无法使用BuildSessionServices.createFileHasher()创建FileHasher类型的服务

Flutter,重播 GIF

dart - 为什么在这种情况下使用工厂构造函数

flutter - json_serializable - 将通用字段添加到卡住/json_serializable 类

c# - 完全非阻塞 HTTP 请求 C# ASP.NET

swift - 结合信号量来限制 .notify 的异步请求和调度组与延迟和应用程序卡住

Javascript - 处理异步函数调用的竞争条件

java - 如何获取并设置 "messaging provider"以便 JAXM 客户端调用异步 SOAP API?

Flutter 本地通知 int id 参数

class - 无类 Dart 文件的目的是什么?