2016-11-13 55 views
0

在播放Scala的项目,我同类型控制器的内部返回一个对象:斯卡拉播放2.5谈到一个动作到结果

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

我想返回的结果,我不知道如何正确地调用这个函数

+1

典型地,一个动作是你定义为在控制器的顶层(多个)功能。 Play将调用传递请求的动作并期待您返回结果。为什么你有一个变量'myController'?通常情况下,你会有一个代表你的控制器的类,然后是这个类中代表这些操作的一些方法。如果你想让代码保持原样,你就必须将这个请求应用到'myFunction'上,但正如我所说的,这看起来很奇怪。 – rethab

+1

如果你可以显示'myFunction'在高级别做什么,可以帮助你更多。正如你自己所说的那样,你的行动的设计可能并非如此。另外,请注意'Action.async'需要你返回'Future [Result]'而不仅仅是'Result'。 – Nio

回答

0

Action.async块期望的功能从requestFuture[Result]

现在,您的myFunction()位于yield块内返回JsValue作为返回类型。如果你的理解是在期货上,那么理解的输出变成Future[JsValue]。但播放预计Future[Result]。将结果转换为Future[Result]。所以你的最终输出类型应该是Future[Result]

例如

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

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

yield中'myFunction()'的返回值是'Action [JsValue]',而不仅仅是'JsValue' –

+0

我认为这是一个总体设计问题。 –