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