Scala 未来 return 基于第一个未来结果

Scala future return based on first future result

我有一个调用 api 和 returns 未来的 Scala 未来,如果结果不正确,那么另一个 api 调用将与第一个未来的结果一起提交并 returned 作为未来。

这是我目前所拥有的。

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 结果不准确,有没有办法让我选择 return fut2?

编辑: 第二个未来必须使用第一个未来来继续 api 调用。这是我目前所拥有的。

val fut1 = Future("queryFirst")
val fut2 = fut1 flatMap {
  case y if y.isInstanceOf[Int] => Future("queryAgainWithResult(y)")
  case x => Future(x)
}

您可以 filter 第一个 Future 在其包含的结果与您想要的结果不匹配时导致它失败,然后使用 recoverWith 将值恢复到另一个 Future.

Future(queryFirst)
    .filter(result => /* logic that returns true if result is correct */)
    .recoverWith { case NonFatal(e) => Future(querySecond) }

如果queryFirst成功并通过filter,那么它的结果将被返回(包装在Future)。

如果queryFirst成功并且根据filter没有正确的值只是失败,那么[=21=的结果] 将返回,成功或失败。


编辑: 根据 OP 的新信息,如果您首先需要不正确的结果 Future,那么您实际上并没有选择但使用 flatMap.

Future(queryFirst).flatMap {
    case result if(/* failed condition */) => Future(querySecond(result))
    case result => Future.successful(result)
}