【发布时间】:2019-10-25 21:03:30
【问题描述】:
我有一个方法可以创建Vector 类型的Future,然后我想从中创建适当的 HTTP 响应。
到目前为止,我已经尝试使用 Futures API 中的 transform 和 transformWith 方法来实现这一点,主要是因为它们的参数具有 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)
}
【问题讨论】:
标签: scala playframework future