在 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))
}
}
我正在尝试将数据库合并到我的 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))
}
}