假设我们的目标是构建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, ..., ]
答案 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 == []);
};