如何存储Future的结果供以后使用

时间:2013-04-21 04:41:35

标签: dart

假设我们的目标是构建List,我们将其称为storedResult

我们有多次调用Future<List>返回函数:

Future<List> getList()...

假设我们会多次调用我们的getList()函数未知,并希望将每个List的结果存储到我们的storedResult中:

List storedResult = [];

someOtherList.forEach((element)){
    getList().then((resultingList)){
        storedResult.addAll(resultingList);
    }
}

print(storedResult);

如果我们运行此代码,它将打印为[]。我们如何表达这一点,结果是:

[resultingList, resultingList, ..., ]

1 个答案:

答案 0 :(得分:3)

请记住Futures立即返回,但它们的相关回调是异步运行的。具体来说,getList()所做的工作(以及then所做的一切)在执行返回事件循环之前不会发生。

您的问题是您正在尝试同步打印异步操作的结果,并且无法正常工作。

如果你想使用存储的结果,那么你应该做的是:

Future<List<List>> globFutures(List someOtherList) {
  List<Future> futures = [];
  someOtherList.forEach((element) {
    futures.add(getList());
  });

  // Automatically completes to a List containing all the
  // results of all of the futures.
  return Future.wait(futures);
}

main() {
  var storedResults = [];

  globFutures(someOtherList)
    .then((List<List> results) {
      storedResults = results;

      // Run code in here that depends on storedResults being available.
      print(storedResults);
    });

  // Do **NOT** use storedResults here, as it will be [].
  // The Future functions have not yet run!
  assert(storedResults == []);
};