在Scala中使用Futures?

时间:2016-05-13 06:48:49

标签: scala future

我正在尝试将数据库合并到我的http-microservice中。

微服务有一个函数getValueFromInternet(val: Foo): Future[Value],我的微服务在GET请求上调用了它。现在,我希望它发生,函数getValue(val: Foo): Future[Value]首先查询数据库,如果数据库没有返回结果,请调用getValueFromInternet。数据库查询返回Future[Seq[Value2]],我可以使用函数将Value2转换为Value。如果找不到与该值对应的条目,则返回空Vector

这是我到目前为止所尝试的:

def getValue(val: Foo): Future[Value] = {
  val resultFuture = db.getValue(val)
  // 1st attempt. Clearly wrong
  resultFuture onComplete {
    case Success(Vector()) => getValueFromInternet(val)
    case Success(vec) => convertValue2to1(vec.head)
  }
  // 2nd attempt. This is also wrong
  resultFuture match {
    case Future(Success(Vector())) => getValueFromInternet(val)
    case Future(Success(vec)) => convertValue2to1(vec.head)
  }
}

如果有任何帮助建议我如何做到这一点,我将不胜感激。 我已经独立实现了数据库和微服务,你可以找到它们herehere

1 个答案:

答案 0 :(得分:4)

你必须使用flatMap,因为如果第一个操作没有返回结果你想要做的事情也会返回一个未来。

在编译时尽可能接近您的代码。请注意,您不能在scala中使用名为val的标识符,因为这是一个关键字。

def getValue(v: Foo)(implicit ec: ExecutionContext): Future[Value] = {
  val resultFuture: Future[Seq[Value2]] = db.getValue(v)
  resultFuture.flatMap { vec =>
    if(vec.isEmpty)
      getValueFromInternet(v)
    else
      Future.successful(convertValue2to1(vec.head))
  }
}