斯卡拉期货。如果其中一个失败则采取行动

Scala Futures. Action if one of several fails

我有一种情况,我想作为未来并发执行多个任务,这样如果其中一个任务失败,其他任务仍然会执行。 如果失败,我想记录它的错误。 我希望我的父线程能够判断每个线程是否成功,然后根据它执行一些操作。例如,如果其中一个期货失败,则打印 "Hey, one of the futures failed"

val futureA = Future(doTaskThatReturnsABoolean)
val futureB = Future(doTaskThatReturnsABoolean)
val futureC = Future(doTaskThatReturnsABoolean)

futureA.onFailure (case t => println(future A failed ) + t.getMessage)
futureB.onFailure (case t => println(future B failed ) + t.getMessage)
futureC.onFailure (case t => println(future C failed ) + t.getMessage)

if (one of these futures failed) {
  println("One of the futures failed")
  throw new someNewError
}

如果任何或所有期货失败,我想记录它们的堆栈跟踪,但我不想在所有期货都有机会 运行 之前导致我的整个程序出错。因为他们都可能因为不同的原因而出错,我不想重复他们的错误,我想抛出一个新的错误。

我一直在阅读 http://docs.scala-lang.org/overviews/core/futures.html 但就是无法理解这本书。

我不想使用 "Await",因为这需要时间,我想给期货尽可能多的时间 运行。现在让我们假设它们 "will" 完成,但在完全取决于数据大小的不确定时间范围内完成。

应该是这样的:

val futureA = Future(doTaskThatReturnsABoolean).recoverWith{
  case e:Throwable => println(future A failed ) + t.getMessage; Future.failed(e)
}
val futureB = Future(doTaskThatReturnsABoolean).recoverWith{
  case e:Throwable => println(future B failed ) + t.getMessage; Future.failed(e)
}
val futureC = Future(doTaskThatReturnsABoolean).recoverWith{
  case e:Throwable => println(future  failed ) + t.getMessage; Future.failed(e)
}

val futures = List(futureA, futureB, futureC)
Future.sequence(futures).recoverWith{
  case p:Throwable => println("One of the futures failed"); Future.failed(new SomeNewError)
}

Future.sequence 辅助方法将 futures 集合转换为 future 包装结果集合。如果源期货之一失败,则由此产生的期货将失败。