如何在Scala中完成后立即使用期货列表

时间:2016-11-25 22:29:57

标签: scala future

我有一堆期货可以在极其不同的时间完成,如下所示:

results

现在我想在其中一个输入期货完成时迭代while (!results.allCompleted) { one = results.firstCompletedFuture process(one) } ,基本上轮询结果中的所有期货,直到一个完成,做一些处理,并继续直到所有这些完成。类似的东西:

pvg

2 个答案:

答案 0 :(得分:1)

您正在寻找firstCompletedOf

答案 1 :(得分:1)

没有必要在Futures列表上“循环”以在完成时对它们采取行动。方法是链 使用组合器进行所需的计算序列并等待它们全部终止。

就上述代码而言,可以写成:

val results:List[Future[Result] = task.getAssignedFiles map {
  file: File => Future[Result] {
    <heavy computation>
  }
} 
val processedResults:List[Future[ProcessedResult]] = results.map(result => process(result))
val finalResults:Future[List[ProcessedResult]] = Future.sequence(processedResults)

请注意,所有期货从定义时开始计算。 sequence将在最后一次完成时完成。