如何根据未来产生的Dart分配期货结果?

时间:2017-10-15 22:59:29

标签: dart future

在Dart中,我想运行几个昂贵的函数,这些函数彼此独立,并根据生成它们的函数将结果分配给我的变量。大致相当于此的并行版本:

double x = getX();
double y = getY();

我在考虑这样的事情:

double x, y;
Future.wait([
  futureGetX(),
  futureGetY()
]).then((List results) {
  results.foreach((r) {
    // if(r is produced by futureGetX) x = r;
    // if(r is produced by futureGetY) y = r;
  }); 
});

我不知道如何实现这个is produced by部分。一种方法是将每个函数的结果包装在另一个类中,并在then部分中检查结果的类:

if(r is wrapperForX) x = r.getValue();
if(r is wrapperForY) y = r.getValue();

但这对我来说似乎非常不优雅。有什么建议吗?

4 个答案:

答案 0 :(得分:1)

未经测试,但我想我得到了这个。 :)

使用闭包:

{{1}}

答案 1 :(得分:0)

感谢Randal,我找到了一个解决方案:

Future.wait([
  () async { x = await futureGetX(); } (),
  () async { y = await futureGetY(); } ()
]);

答案 2 :(得分:0)

要等待Futures并行,您可以使用Future.wait,正如您已经注意到的那样。 Future.wait返回(异步)列表中的结果与原始期货的相同的顺序,因此您可以这样做,而不是使用forEach

x = results[0];
y = results[1];

答案 3 :(得分:0)

另一种方法是从异步包中使用FutureGroup,记录结果列表的FIFO行为:https://www.dartdocs.org/documentation/async/1.13.3/async/FutureGroup-class.html