2017-10-15 147 views
0

在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

我们如何知道哪一个产生了结果?没有产生结果的那个返回null吗?或者你只想得到第一个结果而忽略第二个结果? –

回答

0

感谢兰德尔我找到了一个解决方案:

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

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

使用闭:

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

谢谢,这已经足够接近了。但是列表元素需要的是期货,而不仅仅是函数。请参阅下面的答案。 –

0

要等待并行期货,您使用Future.wait,因为你已经注意到了。 列表返回的结果(异步)由Future.wait是因为原来的期货相同的顺序,所以不是使用forEach你可以这样做:

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

很高兴知道,但它是一种黑客或功能? –

+0

功能。我可以看到它没有实际记录(doh!),但我可以向你保证,它的目的是以这种方式工作。 – lrn