【问题标题】:rendering a page after Future is done with Play2使用 Play2 完成 Future 后渲染页面
【发布时间】:2018-07-30 17:39:39
【问题描述】:

使用带有 Slick DB 管理器的 Play2 框架,我有一个封装 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 等到数据库查询完成后再打印结果?

【问题讨论】:

    标签: scala playframework-2.0 slick


    【解决方案1】:

    使用 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"))
     }
    }
    

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

    并在您的 getOrElse 块中使用:

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

    这将是必要的

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2011-08-15
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 2017-12-08
      相关资源
      最近更新 更多