在游戏2.3.2中使用Future

时间:2014-11-06 09:14:55

标签: html scala asynchronous playframework

我正在写一个Play 2.3.2应用程序。 在我的控制器中,我有一个计算Future[Option[(String, Int)]]的异步方法。

因为计算速度很慢,我想开始创建我的视图,当计算完成时,完成构建视图。

在同一个控制器中,我有一个调用此方法的动作并加载一个传递结果的视图,如下所示:

def max = Action.async {
        calculateMax.flatMap(result => 
             Future{Ok(recommendationsystem.views.html.manager.statistics.max(result))

         )  

}

我的最大视图是这样实现的:

@(max: scala.concurrent.Future[Option[(String, Int)]])

@import util._

@recommendationsystem.views.html.main("Max tag")(recommendationsystem.views.html.nav.navbar("statistics")) {
    <h1>Most used tag</h1>
    @max flatMap {result => result match {
    case Some(x) => {
        <p>
        <ul>
            <li>Tag: @x._1</li>
            <li>Occurrencies: @x._2</li>
        </ul>
        </p>


    }
    case None => {
        <p>No one tag present in the db</p>

    }
    }
    }

    <p><a href="@recommendationsystem.controllers.manager.routes.StatisticsController.index()"></a> </p>
}

但是这段代码没有编译,编译器给了我以下编译错误:

[error] /Users/alberto/git/bdrim/modules/recommendation-system/app/recommendationsystem/views/manager/statistics/max.scala.html:8: ')' expected but 'case' found.
[error]     case Some(x) => {
[error]     ^
[error] /Users/alberto/git/bdrim/modules/recommendation-system/app/recommendationsystem/views/manager/statistics/max.scala.html:18: ')' expected but 'case' found.
[error]     case None => {
[error]     ^
[error] /Users/alberto/git/bdrim/modules/recommendation-system/app/recommendationsystem/views/manager/statistics/max.scala.html:26: ';' expected but ',' found.
[error]     <p><a href="@recommendationsystem.controllers.manager.routes.StatisticsController.index()"></a> </p>
[error] ^
[error] three errors found
[error] /Users/alberto/git/bdrim/modules/recommendation-system/target/scala-2.11/twirl/main/recommendationsystem/views/html/manager/statistics/max.template.scala:27: ')' expected but 'case' found.
[error]     """),_display_(/*7.6*/max),format.raw/*7.9*/(""" """),format.raw/*7.10*/("""flatMap """),format.raw/*7.18*/("""{"""),format.raw/*7.19*/("""result => result match """),format.raw/*7.42*/("""{""")/*8.5*/case Some(x) =>/*8.20*/ {_display_(Seq[Any](format.raw/*8.22*/("""
[error]                                                                                                                                                                                                              ^
[error] /Users/alberto/git/bdrim/modules/recommendation-system/target/scala-2.11/twirl/main/recommendationsystem/views/html/manager/statistics/max.template.scala:36: ')' expected but 'case' found.
[error]     """)))}/*18.5*/case None =>/*18.17*/ {_display_(Seq[Any](format.raw/*18.19*/("""
[error]                    ^
[error] /Users/alberto/git/bdrim/modules/recommendation-system/target/scala-2.11/twirl/main/recommendationsystem/views/html/manager/statistics/max.template.scala:40: ';' expected but ',' found.
[error]     """)))},format.raw/*23.5*/("""}"""),format.raw/*23.6*/("""
[error]            

似乎视图无法看到Future类型。 怎么了?

1 个答案:

答案 0 :(得分:3)

这里的编译错误来自你的旋转语法,而不是Future。旋转模板非常挑剔,间距和新线条。带有空格的@max flatMap肯定会打破一些东西,因为旋转不知道它是否应打印出max,或者寻找更多代码。最好用@{ ... }包围整个块。

但其中一些是无关紧要的,因为你不应该首先将Future传递给视图。模板不会部分渲染,然后再填充Future值。在recommendationsystem.views.html.manager.statistics.max中包装Future.apply基本上什么都不做。这里要注意的关键是result甚至不是Future。假设calculateMax返回Future[Option[(String, Int)]],当您致电map时,您将异步操作该Option[(String, Int)]的{​​{1}}结果。

所以你的控制器功能应如下所示:

Future

您的观点是这样的:

def max = Action.async {
    calculateMax.map(result => 
        Ok(recommendationsystem.views.html.manager.statistics.max(result))
    )
}