【问题标题】:Are there any reasons to use Action.async other than readability in Play Framework?除了 Play Framework 中的可读性之外,还有什么理由使用 Action.async 吗?
【发布时间】:2020-02-27 16:14:30
【问题描述】:

我阅读了 play async action 的 official doc 并了解 Action.async 是

只是一种简化基于返回 Future 的 API 创建操作的工具。

我担心的是,如果你盲目地返回 Future[Response],它似乎会引入未处理的错误,因为 Future 可能是失败。

当然,您可以通过类似的方式处理失败案例

def index = Action.async {
  intensiveComputation()
    .map { i => Ok("Got result: " + i) }
    .recover { case e: Exception => InternalServerError("error")}
}

但是您也可以通过编写类似这样的内容来使用 Action,并且始终如一地使用 Action 而不是 Action.async,您不会忘记处理错误情况。

def index = Action {
  intensiveComputation().onComplete {
    case Success(i) => Ok("Got result: " + i)
    case Failure(e) => InternalServerError("error")
  }
}

所以如果我不想引入意外错误,总是使用 Action.apply 是个好习惯吗?还是我错过了什么?

【问题讨论】:

    标签: scala playframework future


    【解决方案1】:

    不用担心,Play 提供了很好的错误处理

    本质上,有一个错误处理程序,它将异常包装在相应的 HTTP 异常中。例如,未处理的错误将是 HTTP 500 异常。

    您也可以提供自己的错误处理程序。

    查看Play Documentation了解更多信息

    【讨论】:

      【解决方案2】:

      一个高水平的答案:

      根据我的理解,第二种方法甚至不会编译,onComplete 返回类型是 Unit 并且 Play 操作需要 Request[AnyContent] => Result(在 Action 的情况下)或 Request[AnyContent] => Future[Result](在Action.async 的情况)。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-02
        • 2021-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多