等待异步函数在 dart 中无法正确执行

Posted

技术标签:

【中文标题】等待异步函数在 dart 中无法正确执行【英文标题】:awaiting on an async function does not execute correctly in dart 【发布时间】:2019-05-31 18:55:19 【问题描述】:

我的飞镖程序中有一些与 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 在调用函数的执行可以继续之前返回?

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于等待异步函数在 dart 中无法正确执行的主要内容,如果未能解决你的问题,请参考以下文章

Dart - 在 for 循环中等待所有异步任务

等待 Dart 异步函数完成

理解 Dart 中的异步和同步

Dart异步编程--Future

颤振/飞镖异步不等待

Dart:如何在异步函数中管理并发