在下面的代码中,我有一个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")
}
}
}
答案 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")
}