【问题标题】: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 函数仍需要一些错误处理。

    【讨论】:

    • 这太棒了!感谢您指出一种更标准的思考问题的方式。
    猜你喜欢
    • 2016-11-08
    • 1970-01-01
    • 2019-10-25
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多