首页 > 解决方案 > 等待异步函数在 dart 中无法正确执行

问题描述

我的飞镖程序中有一些与 SQLite 数据库交互的异步函数。我使用 await 表达式来调用这些函数,并且大多数函数在它们被等待但一个函数没有执行并且调用函数继续执行而不等待被调用函数时执行。这是代码:

Future<int> addShoppingList(String listName) async {
    var dbClient = await db;
    String now = new DateTime.now().toString();
    await dbClient.transaction((txn) async {
      int res = await txn.rawInsert("insert into lists(list_name,list_created_at) values(\'$listName\',\'$now\')");
      print('result of adding a new shopping list: $res');
      return res;
    });
    List<Map> resList = await dbClient.rawQuery("select list_id from lists where list_name=\'$listName\'");
    if (resList.length > 0) {
      return resList[0]['list_id'];
    }
    return 0;
    //await dbClient.rawInsert("insert into lists(list_name,list_created_at) values(\'$listName\',\'$now\')");
  }

  Future<int> addShoppingListItems(int listId, Map<String,String> listItems) async {
    var dbClient = await db;
    int res = 0;

    listItems.forEach((itemName, quantity) async{
      int itemId = await getItemId(itemName);
      print('adding item $itemName with id $itemId');
      await dbClient.transaction((txn) async {
        res = await txn.rawInsert("insert into list_items values($listId,$itemId,\'$quantity\')");
        print('result of adding item in list_items: $res');
      });
      return res;
    });
    return 0;
  }

  Future<int> addItemsToShoppingList(String listName, Map<String,String> listItems) async {
    int listId = await getListId(listName);
    if (listId == 0) {
      listId = await addShoppingList(listName);
      print('got list id of $listId after adding new list');
    }
    print('in additemstoshoppinglist list id: $listId');
    print('in additemstoshoppinglist  ${listItems.toString()}');
    int res = await addShoppingListItems(listId, listItems);
    print('result after adding item in addItemsToShoppingList: $res');
    return res;
  }

在我的外部类中,我等待addItemsToShoppingList函数启动整个函数链。getListId()当我运行代码时,我看到函数addShoppingList()被正确等待(addItemsToShoppingList直到等待的函数被执行后才会继续执行)但是当我等待时addShoppingListItems,调用函数的执行不会等到addShoppingListItems返回。我在这里缺少什么以及如何确保addShoppingListItems在调用函数的执行可以继续之前返回?

标签: asynchronousdartasync-await

解决方案


我发现问题出在正在使用的地图的每个循环中等待异步函数的方式。我用这里给出的解决方案解决了这个问题:Map forEach function exits with a await inside


推荐阅读