【问题标题】:Converting a Future[T] to an always-successful Future[Option[T]]将 Future[T] 转换为始终成功的 Future[Option[T]]
【发布时间】:2015-03-20 19:07:11
【问题描述】:
我想到的激励用例如下:
- 在 Play Framework 控制器中,我调用 Play 的
WS。这会产生一个可能失败的Future
- 我想处理
WS 请求成功与失败的不同情况。在这两种情况下,我都想最终制作一个 Play Response(可能是 Future[Response])
我认为我想做的是:
- 异步,future完成后,无条件处理完成
- 生成与所需响应对应的
Future[Response]
我不相信我可以使用Future.map,因为我需要自定义对失败案例的处理,而不仅仅是传递Future 的失败。
如果您对如何干净地解决此问题有任何替代建议,请告诉我。
【问题讨论】:
标签:
web-services
scala
playframework
future
playframework-2.3
【解决方案1】:
您正在寻找Future.recover。
val wsResponse: Future[WSResponse] = ???
wsResponse map { response =>
// Success case
Ok(response.json)
} recover {
// Failure case, turn your throwable into a response
case t: Throwable =>
InternalServerError(t.getMessage)
}
recover 采用偏函数 Throwable => T。在这种情况下,T 可能是Option[Response],因此您可以根据成功和失败情况下的业务逻辑来构建它。
请注意,如果(例如)您的调用从外部服务器返回 404,Play 的 WS 库将为失败的 HTTP 调用返回一个成功的未来,因此您的 map 函数仍需要一些错误处理。