Учитывая следующие List
целых чисел...
val l = List(1, 2, 3)
... Мне нужно вызвать 2 метода, которые возвращают Future
для каждого элемента и получают следующий результат:
Future(Some(1), Some(2), Some(3))
Вот моя попытка:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def f1(i: Int) = Future(i)
def f2(i: Int) = Future { if (i % 2 == 0) throw new Exception else i }
val l = List(1, 2, 3)
val results = Future.sequence(l.map { i =
val f = for {
r1 <- f1(i)
r2 <- f2(i) // this throws an exception if i is even
} yield Some(r1)
f.recoverWith {
case e => None
}
})
Если f2
выйдет из строя, я хочу восстановить и продолжить работу с оставшимися элементами. Приведенный выше код не работает, так как recoverWith
никогда не вызывается, даже если f2
терпит неудачу.
Как восстановиться после сбоя f2
, чтобы окончательный результат был примерно таким?
Future(Some(1), None, Some(3))
Второй элемент должен быть None
, потому что f2
не работает, когда входное целое число четное (т.е. 2).