将 Future[T] 转换为永远成功的 Future[Option[T]]

Converting a Future[T] to an always-successful Future[Option[T]]

我想到的激励用例如下:

我想我想做的是:

我不相信我可以使用 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 函数仍然需要一些错误处理。