我有一个调用api并返回未来的Scala未来,如果结果不正确,那么将在未来的第一个结果中提交另一个api调用,并在将来返回。
这是我到目前为止所做的。
val fut1 = Future(queryFirst)
val fut2 = fut1 map {
case y if y.isInstanceOf[NoResult] => Future(queryAgainWithFut1Result)
case x => x
}
但如果我访问fut2结果,它会给出类似这样的结果:
scala.concurrent.Await.result(fut2, 5 seconds)
warning: there was one feature warning; re-run with -feature for details
fut2: Any = scala.concurrent.impl.Promise$DefaultPromise@61ab71c2
如果fut1结果不准确,有没有办法可以选择返回fut2?
修改 第二个未来必须使用第一个未来继续api呼叫。这是我到目前为止所做的。
val fut1 = Future("queryFirst")
val fut2 = fut1 flatMap {
case y if y.isInstanceOf[Int] => Future("queryAgainWithResult(y)")
case x => Future(x)
}
答案 0 :(得分:8)
您可以filter
第一个Future
导致其包含的结果与您想要的内容不匹配时失败,然后使用recoverWith
将值恢复为另一个Future
{1}}。
Future(queryFirst)
.filter(result => /* logic that returns true if result is correct */)
.recoverWith { case NonFatal(e) => Future(querySecond) }
如果queryFirst
成功并通过filter
,则会返回其结果(包含在Future
中)。
如果queryFirst
成功且根据filter
或没有正确的值,则会失败,则会返回Future(querySecond)
的结果,成功还是失败。
编辑:根据OP的新信息,如果您需要错误的第一个Future
的结果,那么您实际上没有选择,只能使用flatMap
。
Future(queryFirst).flatMap {
case result if(/* failed condition */) => Future(querySecond(result))
case result => Future.successful(result)
}