在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();
但这对我来说似乎非常不优雅。有什么建议吗?
答案 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