等待异步函数在 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 中无法正确执行的主要内容,如果未能解决你的问题,请参考以下文章