Я ищу способ конвертировать произвольный список длин Futures в будущее списка. Я использую Playframework, поэтому, в конечном счете, я действительно хочу, чтобы Future[Result]
, но чтобы сделать вещи проще, давайте просто скажем Future[List[Int]]
. Обычный способ сделать это - использовать Future.sequence(...)
, но там есть твист.. Список, который мне предоставлен, обычно содержит около 10-20 фьючерсов, и это не редкость для отказа одного из этих фьючерсов (они делают запросы внешнего веб-сервиса). Вместо того, чтобы повторять все из них в случае, если один из них терпит неудачу, я хотел бы иметь возможность получить то, что удалось, и вернуть их.
Например, выполнение следующих действий не работает
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
за кулисами.
Заранее благодарим за помощь!