使用Play with Scala键入不匹配映射Future [Seq [model]]

时间:2015-11-16 18:50:30

标签: scala playframework

我仍然有时会使用Play with Scala来映射Futures ......

我试图将我的整个Supply DB表(即DB中的所有耗材)传递给视图 我尝试了两种截然不同的方法,但都失败了...... 以下是我尝试的方法和我得到的错误。

有人可以帮我解决这个问题吗,并解释一下为什么这两个都失败了? 提前谢谢!

注意:致电supplyService.all会返回Future[Seq[Supply]]

首次尝试

  def index = SecuredAction.async { implicit request =>
    supplyService.all map { supplies =>
      Future.successful(Ok(views.html.supplies.index(request.identity, SupplyForm.form, supplies)))
    }
  }

enter image description here

第二次尝试

  def index = SecuredAction.async { implicit request =>
    val supplies = supplyService.all

    Future.successful(Ok(views.html.supplies.index(request.identity, SupplyForm.form, supplies)))
  }

enter image description here

1 个答案:

答案 0 :(得分:1)

没有Future.succesfull

的第一个变体
supplyService.all.map( supplies => Ok(views.html.supplies.index(request.identity, SupplyForm.form, supplies)) )

由于您可以构建函数Seq[Supply] => Result,因此您可以轻松map 通过functor界面Future[Seq[Supply]]Future[Result]

未来也是monad,因此您可以Seq[Supply] => Future[Result]使用flatMap方法。

但是Future.successfull是monad单位,而Future的许多monad是真的

mx.flatMap(f andThen unit) = mx.map(f)

所以你的

ms.flatMap(supplies => Future.successfull(f(supplies)) = 
ms.flatMap(f andThen Future.successfull) = 
ms.map(f)