我想到的激励用例如下:
WS
。这会产生可能失败的Future
WS
请求成功与失败的单独案例。在这两种情况下,我想最终制作一个Play Response
(可能是Future[Response]
)我认为我想做的是:
Future[Response]
我不相信我可以使用Future.map
因为我需要自定义失败案例的处理方式,而不仅仅是传递Future
的失败。
如果您对如何彻底解决这个问题有任何其他建议,请告诉我。
答案 0 :(得分:4)
您正在寻找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]
,因此您可以根据成功和失败案例中的业务逻辑来构建它。
请注意Play的WS库将为失败的HTTP调用返回一个成功的未来,如果(例如)您的调用从外部服务器返回404,那么您的map
函数仍然需要一些错误处理。