如何在 Scala 中完成后立即消费一份期货清单

How to consume a list of futures as soon as one completes in Scala

我有一堆 Futures 可以在完全不同的时间完成,像这样:

val results = task.getAssignedFiles map {
  file: File => Future[Result] {
    <heavy computation>
  }
}

现在我想在其中一个输入 future 完成后立即迭代 results,基本上轮询结果中的所有 futures 直到一个完成,做一些处理,然后继续直到所有这些都完成。类似于:

while (!results.allCompleted) {
  one = results.firstCompletedFuture
  process(one)
}

您正在寻找 firstCompletedOf

无需 "loop" 完成期货列表即可在它们完成时对其采取行动。方法是链 使用组合器所需的计算序列并等待它们全部终止。

上面的代码可以写成:

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 将在最后一个完成时完成。