Scala Play 2.5将动作转化为结果

时间:2016-11-13 04:51:49

标签: scala playframework playframework-2.0

在Play scala项目中,我返回一个控制器内的对象,其类型为:

play.api.mvc.Action[play.api.libs.json.JsValue然而,游戏抱怨它期待play.api.mvc.Result。根据文档,Action是一个处理请求并生成结果的函数。

def myController = mySpecialFunction.asyc(prase.tolerantJson) { implicit request => {
        for {
            ... do some stuff ...
        } yield {
            myFunction()
        }
    }
}

在这种情况下,myFunction的返回类型为play.api.mvc.Action[play.api.libs.json.JsValue

我想返回一个结果,我不确定如何正确调用此函数

2 个答案:

答案 0 :(得分:0)

您的Action.async区块需要requestFuture[Result]的功能。

现在,您的myFunction()位于yield块内,返回JsValue作为返回类型。如果你的理解是在期货上,则for-comprehension的输出变为Future[JsValue]。但是游戏期待Future[Result]。将结果转换为Future[Result]。因此,您的最终输出类型应为Future[Result]

例如

Action.async { req =>
  val resultFuture = 
    for {
      _ <- getUsersFuture
      _ <- doSomethingFuture
    } yield (myFunction)

  resultFuture.map { json => Ok(json) }
}

答案 1 :(得分:0)

如果您想按原样解决问题,可以将请求传递给myFunction()的结果:

def myController = mySpecialFunction.asyc(prase.tolerantJson) { implicit request => {
        for {
            ... do some stuff ...
        } yield {
            myFunction()(request)
        }
    }
}

这是有效的,因为有一个方法Action#apply将使用request实例调用并返回Future[Result]

apply方法的文档:https://www.playframework.com/documentation/2.5.x/api/scala/index.html#play.api.mvc.Action