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