在下面的代码中,我必须返回在另一个未来之后调用的未来结果。我在future2.map
行中收到以下错误:
类型不匹配;发现:scala.concurrent.Future [play.api.mvc.Result] 必需:play.api.mvc.Result
如何使这项工作?
def method1 = Action.async { request =>
val future1 = f1
future1.map { result1 =>
val future2 = f2
future2.map { result2 =>
Ok(result1+result2+"")
}
}
}
def f1 = Future { 1 }
def f2 = Future { 2 }
答案 0 :(得分:4)
你可以通过多种方式做到这一点。但首先,您需要了解map
和flatMap
如何与Future
合作:
def map[S](f: (T) ⇒ S): Future[S]
def map[S](f: (T) ⇒ Future[S]): Future[Future[S]]
def flatMap[S](f: (T) ⇒ Future[S]): Future[S]
请注意,在上述签名中,您使用的值map
即flatMap
或already is a future
来调用Future[<some-value>].map(...)
和Future[<some-value>].flatMap(...)
。< / em>的
方法1:
def method1 = Action.async { request =>
val future1 = f1
future1.flatMap { result1 => //replaced map with flatMap
val future2 = f2
future2.map { result2 =>
Ok(result1+result2+"")
}
}
}
def f1 = Future { 1 }
def f2 = Future { 2 }
方法2:
def method1 = Action.async { request =>
val future1 = f1
future1.flatMap { result1 => //replaced map with flatMap
val future2 = f2
future2.flatMap { result2 => //replaced map with flatMap
Future.successful{Ok(result1+result2+"")} // used Future.successful{} to generate a Future of Result
}
}
}
def f1 = Future { 1 }
def f2 = Future { 2 }
答案 1 :(得分:3)
将future1.map
更改为future1.flatMap
应该可以解决问题。通过Future
进行映射会返回另一个Future
并更改其中的值。在这种情况下,您要返回的Future
包含另一个 Future
,其中包含Result
。通过使用flatMap
,它基本上将嵌套的Future[Future[Result]]
展平为Future[Result]
。