Вы абсолютно правы, когда говорите, что последний оператор функции становится оператором возврата. Однако, если вы видите определение метода onSuccess
и onFailure
, они оба возвращают Unit
в качестве возвращаемого типа.
Из документов Scala подпись onSuccess -
def onSuccess[U](pf: PartialFunction[T, U])(implicit executor: ExecutionContext): Unit = onComplete {
case Success(v) =>
pf.applyOrElse[T, Any](v, Predef.identity[T]) // Exploiting the cached function to avoid MatchError
case _ =>
}
В похожих строках onFailure возвращает единицу.
def onFailure[U](@deprecatedName('callback) pf: PartialFunction[Throwable, U])(implicit executor: ExecutionContext): Unit = onComplete {
case Failure(t) =>
pf.applyOrElse[Throwable, Any](t, Predef.identity[Throwable]) // Exploiting the cached function to avoid MatchError
case _ =>
}
В вашей ситуации вы можете применить к карте функцию на будущее, а не onComplete. Это поможет вам распространять ваш требуемый тип.
Кроме того, если вы хотите обработать условие, когда ваше будущее терпит неудачу, вы можете добавить блок восстановления к своему будущему как
.recover {
case _ =>
//whatever type you want to propogate ex: Left()
}