2

假设我们的目标是构建一个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, ..., ]
4

1 回答 1

3

请记住,Future 会立即返回,但它们关联的回调异步运行。具体来说,在执行返回事件循环之前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 == []);
};
于 2013-04-21T05:42:32.137 回答