【问题标题】:Dartlang 'await' not waiting?Dartlang'等待'不等待?
【发布时间】: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


【解决方案1】:

由于某种原因,等待语句的问题消失了。 但是因为我之前也遇到过类似的情况,我以后会看这个,看看是否有一些等待错误。

您可以在

找到有关此问题/解决空问题 (*) 的进一步讨论

https://github.com/dart-lang/sdk/issues/27469

(*) 空问题: Error with storage initialization: Invalid argument: null

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 2018-12-09
    • 1970-01-01
    • 2018-05-04
    • 2020-05-09
    • 2021-09-15
    • 1970-01-01
    • 2019-05-10
    • 2016-07-07
    相关资源
    最近更新 更多