【问题标题】:Waiting for Futures raised by other Futures等待其他期货提出的期货
【发布时间】:2014-05-31 11:46:57
【问题描述】:

我正在使用 Lawndart 库访问浏览器数据,并希望收集一组查询的结果。这是我认为应该起作用的方法:

  numberOfRecordsPerSection(callback) {
    var map = new Map();

    db_sections.keys().forEach((_key) {
      db_sections.getByKey(_key).then((Map _section) {
        int count = _section.length;
        map[_key] = count;
      });
    }).then(callback(map));
  }

但是,当回调被调用时,map 仍然是空的(它被正确填充,但稍后,在所有 Futures 完成之后)。我认为问题在于getByKey() 调用创建的期货没有被forEach() 调用创建的期货“捕获”。

如何更正我的代码以正确捕获结果?

【问题讨论】:

    标签: dart dart-async


    【解决方案1】:

    How do I do this jquery pattern in dart? 的代码看起来和你的很相似

    对于_db.keys() 的每个条目,一个future 被添加到一个数组中,然后等待它们全部被Future.wait() 完成

    不确定此代码是否有效(有关链接问题的答案,请参阅 cmets)

    void fnA() {
        fnB().then((_) {
            // Here, all keys should have been loaded
        });
    }
    
    Future fnB() {
      return _db.open().then((_) {
        List<Future> futures = [];
        return _db.keys().forEach((String key_name) { 
          futures.add(_db.getByKey(key_name).then((String data) {
            // do something with data
            return data;
          }));
        }).then((_) => Future.wait(futures));
      });
    }
    

    【讨论】:

    • 除了小问题,这正是我要解决的问题。 add参数中的then调用的返回不需要创建new Future,而最后的then调用需要有一个函数参数,所以把(_) =&gt;放在Future.wait之前。
    • 另一个可能太聪明的解决方案是:return _db.keys().map(...).fold(new Future.value(), (a, b) =&gt; a.then((_) =&gt; b)。如果有很多元素,我希望Future.wait 更有效率。
    • 感谢两位的帮助。该解决方案在进行一次小的更改以删除不需要的参数后起作用:futures.add(_db.getByKey(key_name).then((String data) {
    • 我只是在页面这里开发的。请告诉我需要进行哪些更改?
    • 嗨@GünterZöchbauer - 我在评论中不小心按了回车键 - 请立即查看更新版本。
    猜你喜欢
    • 2020-10-31
    • 2023-01-19
    • 1970-01-01
    • 2015-06-03
    • 2013-06-29
    • 2014-02-04
    • 2019-10-29
    • 2014-06-17
    • 1970-01-01
    相关资源
    最近更新 更多