将 Future[T] 转换为永远成功的 Future[Option[T]]
Converting a Future[T] to an always-successful Future[Option[T]]
我想到的激励用例如下:
- 在 Play Framework 控制器中,我正在调用 Play 的
WS
。这会产生一个可能失败的 Future
- 我想处理
WS
请求成功与失败的不同情况。在这两种情况下,我最终都想制作一个 Play Response
(可能是 Future[Response]
)
我想我想做的是:
- 异步,future完成后,无条件处理完成
- 生成一个
Future[Response]
对应于所需的响应
我不相信我可以使用 Future.map
,因为我需要自定义失败案例的处理,而不仅仅是传递 Future
的失败。
如果您对如何彻底解决此问题有任何替代建议,请告诉我。
您正在寻找 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 调用 return 一个成功的未来,如果(例如)您的调用 return 是来自外部服务器的 404,那么您的 map
函数仍然需要一些错误处理。
我想到的激励用例如下:
- 在 Play Framework 控制器中,我正在调用 Play 的
WS
。这会产生一个可能失败的Future
- 我想处理
WS
请求成功与失败的不同情况。在这两种情况下,我最终都想制作一个 PlayResponse
(可能是Future[Response]
)
我想我想做的是:
- 异步,future完成后,无条件处理完成
- 生成一个
Future[Response]
对应于所需的响应
我不相信我可以使用 Future.map
,因为我需要自定义失败案例的处理,而不仅仅是传递 Future
的失败。
如果您对如何彻底解决此问题有任何替代建议,请告诉我。
您正在寻找 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 调用 return 一个成功的未来,如果(例如)您的调用 return 是来自外部服务器的 404,那么您的 map
函数仍然需要一些错误处理。