我写了一个简单的方法,根据我在其中执行的服务调用返回Int of Int。
我的问题是服务调用im正在返回某个值的未来,所以我认为我可以做onComplete并返回我想要完成的未来,但是onComplete返回Unit ...
这就是我希望它发挥作用的方式:
def getListOfInts(str: String): List[Int] = {
myDaoService.findSomethingInDb(str).onComplete {
case Success(res) =>
res.map(line => line.amount.toInt*100).distinct.filter(num => num != 0).toList
case Failure(exception) => logger.error(s"finding in db has failed with exeption: ", exception)
}
}
在未来完成时返回未来需求值的正确方法是什么?
我通常知道它的map/flatmap
,但这将使它在未来保持包装,我希望我的方法能够返回实际价值,而不是价值的未来......
谢谢!
答案 0 :(得分:2)
Await.result
是要走的路,但不建议这样做。
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
import scala.concurrent.Await
def getListOfInts(str: String): List[Int] = {
Await.result(myDaoService.findSomethingInDb(str), 10 seconds).map(line => line.amount.toInt*100).distinct.filter(num => num != 0).toList
}
除非你想让结果的执行线程等待(阻塞),否则不建议使用上述方法。上面的代码不能扩展。
推荐方式
def getListOfInts(str: String): Future[List[Int]] =
myDaoService.findSomethingInDb(str).map { res =>
res.map(line => line.amount.toInt*100).distinct.filter(num => num != 0).toList
}
推荐的方法是组合未来(使用map和flatmap将数据库调用的输出类型转换为所需的结果),然后最终等待获得最终的转换结果。
答案 1 :(得分:0)
http://docs.scala-lang.org/overviews/core/futures.html
onComplete,onSuccess和onFailure是您正在寻找的回调