在Play for Scala中回收未来的回应

时间:2017-12-01 21:06:45

标签: scala playframework

在下面的代码中,我有一个Play for Scala函数,future内有一个yield。我收到编译错误type mismatch; found : scala.concurrent.Future[Nothing] required: play.api.mvc.Result。难道我不能在收益率中平面映射未来以返回Ok响应吗?

  def f1 = Future { 1 }
  def f2 = Future { 2 }

  def index = Action.async (parse.json) { request => 

        for { x1 <- f1 }
        yield {
           val f = f2
           f.flatMap { result =>
              Ok("X")
           }

        }
  }

1 个答案:

答案 0 :(得分:4)

不,当你说flatMap时你说的是函数中返回的结果是Future[T],在你的例子中它返回Result,所以只使用map 1}}会起作用,但不是超级惯用,因为当你结束flatten时必须Future[Future[Result]]

(for { x1 <- f1 } yield {
    val f = f2
    f.map( result =>
       Ok("X")
    )
}).flatten

更惯用的是对整个事物使用理解:

for {
  x1 <- f1
  x2 <- f2
} yield {
  Ok("X")
}