【发布时间】:2016-10-04 00:20:02
【问题描述】:
现在我真的对 async/await 感到困惑。
我的问题(我在代码中添加了一些 cmets):
Future<List<TabEntry>> getLinkStructure() async {
_log.finest("getLinkStructure called");
String stringData = await _db.getByKey("structure");
if (stringData == null) {
_log.finest("No Structure saved in database - create default structure");
List<TabEntry> structure = [];
structure.add(new TabEntry("Home"));
//All things are working till here
//Problem: Create key in db - this apparently does not wait
String key = await _db.save(serializeToJson(structure), "structure");
//I EXPECT THE FOLLOWING LOG NEXT
_log.finest("dbKey: $key");
if (key == "structure")
return structure;
else
throw "Error while saving default Home tab in structure";
}
var data = deserialize(stringData);
//INSTEAD I GET THIS LOG
_log.finer("data: ${data}");
return data;
}
如源代码中所述,我希望看到(按此顺序):
- getLinkStructure 已调用
- 数据库中没有保存结构 - 创建默认结构
- dbKey:结构体(保存成功时返回
但是我得到的最后一个 dbkey 日志
- 数据:TabEntry 实例
然后
-
Error with storage initialization: Invalid argument: nullin 外部函数
为什么await _db.save(serializeToJson(structure), "structure") 不等待?
编辑:
所以这是使用的 _db.save 函数:
@override
Future save(String obj, String key) {
return _runInTxn((store) => store.put(obj, key));
}
这是 _runInTxn(...):
Future _runInTxn(Future requestCommand(idb.ObjectStore store),
[String txnMode = 'readwrite']) async {
var trans = _db.transaction(storeName, txnMode);
var store = trans.objectStore(storeName);
var result = await requestCommand(store);
await trans.completed;
return result;
}
【问题讨论】:
-
也许
save(...)(或者更进一步的一些方法)进行了一些异步调用并且没有等待它(或者没有与.then(...)正确链接? -
hmmm,所以,
save(...)是方法,应该等待。所以理论上问题可能是save(...)中的某些函数返回一个未来但稍后执行它?这样我的await返回了,但是内部的future还没有运行? -> 这个保存函数来自 sethladd 的草地飞镖库。 -
serializeToJson(...)是同步调用,应该不是问题 -
但是
_db.save()本身也可以进行异步调用并在它们完成之前返回。 -
好的,所以我在帖子中添加了 _db.save 调用的内容。但从我的角度来看,这并没有错,不是吗?无论如何,您是否知道如何防止此类问题,而无需深入研究库代码?
标签: asynchronous dart async-await