asynchronous - 等待异步函数在 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
在调用函数的执行可以继续之前返回?
解决方案
我发现问题出在正在使用的地图的每个循环中等待异步函数的方式。我用这里给出的解决方案解决了这个问题:Map forEach function exits with a await inside
推荐阅读
- c++ - 如何将数据类型重新分配给 C++ 中的同一个变量?
- command-line-interface - 无法使用 CLI 在 PCF 中创建组织和空间
- pandas - 为聚合数据框设置索引
- python - Python中的多重比较AND和NOT
- iframe - 将 Amazon Affiliate 链接添加到 Netlify CMS Hugo 站点 - 标记 unsafe=true
- javascript - 仅在 html 和 css 中禁用表单提交
- ffmpeg - ffmpeg 切换到“乒乓”结果帧
- java - 如何确定我的代码是否为 O(n)、O(nlogn)、O(1)、O(n^2)?
- python - 如何从python中的dict中提取某些信息?
- android - 从 Android 历史记录重新打开时从子活动返回父活动