У меня есть метод, который создает Future
типа Vector
, из которого я затем хочу создать соответствующий ответ HTTP.
Я пытался реализовать это до сих пор, используя transform
иМетоды transformWith
из Futures API в основном потому, что они имеют сигнатуру Try[T]
для своих аргументов, и я могу различить успех и неудачу.
Предположим, что это метод, производящий Future
типа Vector
def aCoupleOfFutures: Future[Vector[String]] = ???
Используя этот подход, можно заметить повторное использование Try
структуры
val foo:Future[Result] = aCoupleOfFutures.transform {
case Success(strings) => Try(Created(json.Json.toJson(strings)))
case Failure(e) => Try(BadRequest(e.getMessage))
}
Используя этот подход, можно заметить повторное использование Future.successful
вложенности.
val foo:Future[Result] = aCoupleOfFutures.transformWith {
case Success(strings) => Future.successful(Created(json.Json.toJson(strings)))
case Failure(e) => Future.successful(BadRequest(e.getMessage))
}
Используя этот подход, я не могу вернуть необходимое BadRequest
, когда из службы возникла исключительная ситуация.Поскольку подпись перегруженного transform
метода - (def transform[S](s: T => S, f: Throwable => Throwable)
)
val foo:Future[Result] = aCoupleOfFutures.transform (
options => Created(json.Json.toJson(options)),
exc => exc
)
Итак, мой вопрос: могу ли я иметь что-то вроде следующего:
val result:Future[Result] = aCoupleOfFutures. someKindOfTransform {
case Success(options) => Created(json.Json.toJson(options))
case Failure(e) => BadRequest(e.getMessage)
}