任意の長さのFutureのリストをFuture of Listに変換する方法を探しています。私はPlayframeworkを使用しているので、結局のところ、私が本当に欲しいのはですが、Future[Result]
物事をより簡単にするために、ただ言っておきましょう。Future[List[Int]]
これを行う通常の方法は、使用することですFuture.sequence(...)
が、ひねりがあります...約10〜20の先物で、これらの先物のうちの1つが失敗することは珍しくありません(彼らは外部のWebサービス要求を行っています)。それらの1つが失敗した場合にすべてを再試行する代わりに、成功したものに到達してそれらを返すことができるようにしたいと思います。
たとえば、次の操作は機能しません
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
確かに私にとって欠けている部分でした。