Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Play Framework 2.3在控制器中处理未来_Scala_Playframework - Fatal编程技术网

Scala Play Framework 2.3在控制器中处理未来

Scala Play Framework 2.3在控制器中处理未来,scala,playframework,Scala,Playframework,我有一个将方法公开为路由的控制器。在这个方法中,我调用一个长时间运行的计算,它返回一个Future[SomeType] 我现在有以下资料: def compute(id: String) = Action.async { request => val result: Future[SomeType] = compute(id) result.map(value => Ok(transform(value, id))) } 到目前为止,这只是一条快乐的道路。如

我有一个将方法公开为路由的控制器。在这个方法中,我调用一个长时间运行的计算,它返回一个Future[SomeType]

我现在有以下资料:

  def compute(id: String) = Action.async { request =>
    val result: Future[SomeType] = compute(id)
    result.map(value => Ok(transform(value, id)))
  }

到目前为止,这只是一条快乐的道路。如果计算(id)导致失败怎么办?怎么处理?我可以用Try block来概括整个过程,但是有更好的替代方案吗?有什么建议吗?

我们通常使用以下模式:

def compute(id: String) = Action.async { request =>
  val result: Future[SomeType] = compute(id)
  result.map(value => Ok(transform(value, id)))
    .recover { case ex =>
      Logger.error("Something went wrong", ex)
      InternalServerError
    }
}

这样,HTTP响应代码将
500 INTERNAL SERVER ERROR
,因此将通知调用者。您可能还希望对请求的参数添加验证,并返回
400错误请求
等。

默认情况下,失败的未来将导致服务器错误响应。您可以
.recover
.recoverWith
从此类故障中回退到自定义响应。恢复块需要部分功能。因此,请您将其更改为case ex=>