【发布时间】:2014-01-19 09:12:36
【问题描述】:
我正在寻找一种将任意长度的 Future 列表转换为列表的 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。
提前感谢您的帮助!
【问题讨论】: