在单个Play操作中进行独立的Slick查询

时间:2017-01-31 11:55:26

标签: scala playframework slick slick-3.0

我有异步Play Action,它使用Slick从数据库中检索数据。显而易见,Slick使用Future来避免阻塞:

def show(id: Long) = Action.async {
 db.run(entities.filter(_.id === id).result.headOption).map {
   case None => templateFor("NEW_OBJECT")
   case Some(x) => Ok(x)
 }
def templateFor(code: String): Future[Result] = {
  db.run(templates.filter(_.code === code).result.headOption).map {
    case None => InternalServerError("No template")
    case Some(x) => Ok(x)
  }
}

问题是,对templateFor()的调用会返回Future,因此整个Action会返回Future[Future[Result]],这不是Play所期望的。所以,我想摆脱嵌套的Future。这样做的简单方法是Await完成它,但我想避免不必要的阻塞。如果我能够从Future[Result]函数生成templateFor()并从我的Action完整地返回它,那将很好,从而用它替换外部Future

1 个答案:

答案 0 :(得分:2)

您可以使用flatMap

对于任何monandic结构,例如Future[T]flatMap采用类型为T => SomeOtherMonad[K]的函数,如果monad将该函数应用于所有元素,然后将它们展平为{{1} }。

Future[K]