当前位置: 首页 > 知识库问答 >
问题:

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

陶博赡
2023-03-14

我有一个Scala future,它调用一个api并返回future,如果结果不正确,那么另一个api调用将与第一个future的结果一起提交并作为future返回

这是我目前为止所拥有的。

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

有没有一种方法,我可以选择返回fot2,如果fot1的结果是不准确的?

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

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

共有1个答案

冉子石
2023-03-14

您可以< code >筛选第一个< code>Future,使其在包含的结果与您想要的结果不匹配时失败,然后使用< code>recoverWith将值恢复到另一个< code>Future。

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

如果< code>queryFirst成功并通过了< code >过滤器,那么它的结果将被返回(包装在< code>Future中)。

如果< code>queryFirst成功,但根据< code>filter没有正确的值或只是失败,则将返回< code>Future(querySecond)的结果,成功或失败。

编辑:根据OP中的新信息,如果您需要错误的第一个Future的结果,那么您实际上别无选择,只能使用平面图

Future(queryFirst).flatMap {
    case result if(/* failed condition */) => Future(querySecond(result))
    case result => Future.successful(result)
}
 类似资料:
  • 我用的是Scala 2.10,Akka 2.1和Play 2.1。当我向后端发送一个http请求时,我要求一个参与者计算一些东西。如果计算结果在超时之前返回,则返回计算结果,否则返回另一个字符串。请参阅下面的代码。 演员如下: 我的问题是,即使演员在超时之前完成,未来也不会“返回”任何内容,因此超时总是过期。我做错了什么?谢谢。

  • 我有一个名为Source的类,它有lazy val isValid来做一些需要时间的网络检查。我让它返回Future[Boolean],这样它就不会阻塞主线程: 现在,我想检查几个来源并丢弃无效的来源。 下面是一些伪代码: 我在想一些方法,可以将从isValid返回的Future[Boolean]转换为其他将来,在验证检查完成后,可以使用整个源对象进行解析。 最好的方法是什么?

  • 简短版: 如何创建 中等待,并在两者之间等待,直到结果可用。同样,我不知道如何在不阻塞线程的情况下进入< code>wait? 简而言之,我正在尝试构建一个系统,该系统正在进行大量的SOAP Web服务调用,其中每个调用都会阻塞很长时间。在大量并发 Web 服务调用的情况下,系统可能很容易耗尽线程。我正在努力寻找一种基于非阻塞I / O的解决方案,该解决方案可以同时允许许多正在进行的Web服务调用

  • 我有一个对象,我想将其转换为

  • 是否有可能“反转”Scala的未来? 有时候,未来成功的结果意味着错误。在这种情况下,翻转一个未来会很好,即调用一个返回未来的函数,如果最初的未来失败,则该函数以指定的值成功,如果最初的未来成功,则以指定的错误失败。

  • 我正在寻找一种将任意长度的期货列表转换为期货列表的方法。我使用的是Playframework,所以最终,我真正想要的是一个<code>未来〔结果〕,但为了让事情更简单,让我们说<code>将来〔List[Int]]通常的方法是使用<code>Future.sequence(…) 例如,执行以下操作不起作用: 我希望能够将1和3从那里拉出来,而不是只得到异常。我尝试将来使用<code>。折叠,但这显