Scala未来的回报基于第一个未来的结果

时间:2015-03-13 17:58:46

标签: scala filter akka future for-comprehension

我有一个调用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)
}

1 个答案:

答案 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)
}