如何在完成后返回Future的值?

时间:2017-04-25 16:04:47

标签: scala playframework scalatest

我写了一个简单的方法,根据我在其中执行的服务调用返回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,但这将使它在未来保持包装,我希望我的方法能够返回实际价值,而不是价值的未来......

谢谢!

2 个答案:

答案 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是您正在寻找的回调