在Future完成Play2之后渲染页面

时间:2018-02-20 11:09:41

标签: scala playframework-2.0 slick

将Play2框架与Slick DB管理器一起使用,我有一个封装DB访问的类,以及一个负责将该信息返回给用户的控制器。大致是这样的:

具有数据库访问权限的类:

  override def getAllAnswersFuture(userID: Int): Future[List[UserAnswer]] = {
    (DB QUERY CREATION AS allAnswersQuery)
    val myquery : Future[Seq[(Int, String)]] =myDB.run(allAnswersQuery.result)

    myquery.map{x => x.map(elem =>(
      UserAnswer(elem._1, elem._2).toList}
  }

控制器:

  def index = Action { request =>
    request.session.get("userID").map { userID =>
      val myUser = userStorage.getUser(userID.toInt)
      val allAnswersFuture  = questionStorage.getAllAnswersFuture(myUser.id)
      allAnswersFuture onComplete {case _ => Ok(views.html.app.stats())}
      Ok(views.html.app.index("Future did not work"))
    }.getOrElse {
      Unauthorized("Oops, you are not connected")
    }
  }

出于某种原因,onComplete的内容永远不会显示,返回"未来不起作用"代替。

我的问题是,如何告诉Play2等待数据库查询完成然后打印结果?

1 个答案:

答案 0 :(得分:2)

使用Action.async处理期货并尝试执行以下操作:

def index = Action.async { request =>
    allAnswersFuture.map{_ => Ok(views.html.app.stats())}.recover {
   case ex: Exception =>
      Ok(views.html.app.index("Future did not work"))
 }
}

而不是在将来使用onComplete时使用Map并恢复,如果你想在将来的回调中返回任何内容。 Future上的OnComplete将不返回任何内容,其返回类型为Unit。 如果Future成功,将填充您的统计页面,并且将在恢复块中填充失败索引页。

在你的getOrElse块中使用:

Future.successful(Unauthorized("Oops, you are not connected"))

这将做必要的