在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
。
我想返回一个结果,我不确定如何正确调用此函数
答案 0 :(得分:0)
您的Action.async
区块需要request
到Future[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