等待其他期货筹集的期货

时间:2014-05-31 11:46:58

标签: dart dart-async

我使用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()电话创建的期货。

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

1 个答案:

答案 0 :(得分:3)

来自How do I do this jquery pattern in dart?的代码与您的代码非常相似

对于_db.keys()的每个条目,将一个未来添加到数组中,然后等待所有这些条目由Future.wait()完成

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

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));
  });
}