在 Scala 中使用期货?

Using Futures in Scala?

我正在尝试将数据库合并到我的 http 微服务中。

微服务有一个函数 getValueFromInternet(val: Foo): Future[Value],我的微服务在 GET 请求时调用了该函数。现在,我希望它发生这样一个函数 getValue(val: Foo): Future[Value] 将首先查询一个数据库,如果数据库 returns 没有结果,则调用 getValueFromInternet。数据库查询 returns a 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)
  }
}

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

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

这在编译时尽可能接近您的代码。请注意,您不能在 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))
  }
}