我正在寻找一种将任意长度的Future列表转换为List的Future的方法。我正在使用Playframework,所以最终,我真正想要的是一个Future[Result]
,但是为了简化起见,我们可以说Future[List[Int]]
通常的做法是使用它,Future.sequence(...)
但是有一点曲折...通常我给出的列表有大约10到20种期货,而且其中一种期货失败(他们正在提出外部Web服务请求)并不罕见。如果希望其中一个失败,则不必重试所有这些,而是希望能够找到成功的并返回它们。
例如,执行以下操作无效
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.Success
import scala.util.Failure
val listOfFutures = Future.successful(1) :: Future.failed(new Exception("Failure")) ::
Future.successful(3) :: Nil
val futureOfList = Future.sequence(listOfFutures)
futureOfList onComplete {
case Success(x) => println("Success!!! " + x)
case Failure(ex) => println("Failed !!! " + ex)
}
scala> Failed !!! java.lang.Exception: Failure
除了希望获得唯一的例外,我还希望能够将1和3从那里拉出来。我尝试使用Future.fold
,但显然只是Future.sequence
在后台调用。
在此先感谢您的帮助!
.recover
确实是我所缺少的。