将未来[T]转换为永远成功的未来[选项[T]]

时间:2015-03-20 19:07:12

标签: web-services scala playframework future playframework-2.3

我想到的激励用例如下:

  • 在Play Framework控制器中,我正在调用Play WS。这会产生可能失败的Future
  • 我想处理WS请求成功与失败的单独案例。在这两种情况下,我想最终制作一个Play Response(可能是Future[Response]

我认为我想做的是:

  • 异步,在未来完成后,无条件地处理完成
  • 生成与所需回复相对应的Future[Response]

我不相信我可以使用Future.map因为我需要自定义失败案例的处理方式,而不仅仅是传递Future的失败。

如果您对如何彻底解决这个问题有任何其他建议,请告诉我。

1 个答案:

答案 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函数仍然需要一些错误处理。