0

我有两个演员,他们可以返回在我的情况下是布尔值的结果,或者他们可以抛出异常这是我的代码

val futureA: Future[Boolean] = ask(ActorA, MessageA(obj)).mapTo[Boolean]
val resultA = Await.result(futureA, timeout.duration) //can return boolean or throw an exception 

val futureB: Future[Boolean] = ask(ActorB, MessageB(obj)).mapTo[Boolean]
       val resultb = Await.result(futureB, timeout.duration)//can return boolean or throw an exception

在这里,我想实现
场景 1,如果 futureA 和 FutureB 成功我应该得到类似 (futureResponseA,futureResponseB) //(true, true)

方案 2如果 futureA 失败它应该继续 FutureB 如果它成功返回我应该得到类似 (exceptionOfFutureA,resultofFutureB)

场景3如果futureA成功返回并且futureB失败我应该得到类似(futureResponseA,exceptionOfFutureB)

场景 4如果 futureA 和 futureB 都失败了,我应该得到类似 (exceptionOfFutureA,exceptionOfFutureB)

为此我尝试了 val futureA = ask(ActorA, MessageA(obj)).mapTo[Boolean] val futureB = ask(ActorB, MessageB(obj)).mapTo[Boolean]

  val f = Try {Future.sequence(List(futureA, futureB))}
  val result = Await.result(f, Duration.Inf)

但我在这val result条线上遇到错误

found   : scala.util.Try[scala.concurrent.Future[List[Boolean]]]
[error]  required: scala.concurrent.Awaitable[?]

我如何存档这些扫描仪请指导

4

1 回答 1

3

ATry不是 a Awaitable,并且 aFuture不会抛出异常,但是Await可以。所以你需要Await用 a包装Try并且,因为你想捕获一个或两个失败,这意味着 2 个不同Await的 s。

val resultTuple = (Try(Await.result(futureA, Duration.Inf))
                  ,Try(Await.result(futureB, Duration.Inf)))

结果类型为Tuple2[Try[Boolean],Try[Boolean]],它涵盖了您布置的 4 个场景: (Success,Success) (Success,Failure) (Failure,Success) (Failure,Failure)

于 2019-02-20T09:57:56.480 回答