Я шукаю спосіб перетворити список довільної довжини ф'ючерсів у список майбутнього. Я використовую 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
за лаштунками.
Заздалегідь дякую за допомогу!
.recover
справді була для мене відсутнім твором.