我有异步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
。
答案 0 :(得分:2)
您可以使用flatMap
,
对于任何monandic结构,例如Future[T]
,flatMap
采用类型为T => SomeOtherMonad[K]
的函数,如果monad将该函数应用于所有元素,然后将它们展平为{{1} }。
Future[K]