1

我们目前有这样的代码

def somemethod() : Future[Resp] = {
   val responseFuture = service.serveV2(req)
   val nextFuture = responseFuture flatMap {
       //do something on success including call to next async service
   }
   nextFuture
}

当然,地图会在超时时被跳过,但我需要将该超时转换为适当的异常,我可以将其传递给我们的 Web 框架以返回正确的响应代码。在scala中如何做到这一点?

另外值得注意的是,我需要返回那个未来。也许我应该在 responseFuture.onFailure 中创建一个承诺并将其连接到该承诺中,还是我完全不在这里?(我想知道是否有更简单的方法,或者我可以尝试走这条路)。

4

1 回答 1

6

您可能想看一下,recoverWith因为它允许您将 aThrowable变成另一个Future可能是失败或成功的,这取决于您要如何处理它。这比常规更灵活一点recover,因为您不必总是在转换中返回成功的结果。所以你可以做这样的事情:

val newFuture = fut.flatMap(doSomething).recoverWith{
  case t:TimeoutException => Future.failed(new SomeOtherException("timeout!!!"))
}

如果我们获得一个成功的未来,flatMap则将生效并且recoverWith不会做任何事情,因为它的部分功能将不匹配。如果未来因非 TimeoutException 失败而flatMap不会发生,并且recoverWithPF 不匹配也不会做任何事情。如果由于 TimeoutException 而失败,flatMap则不会发生,并且recoverWith将启动并将其变成失败的未来,包装一个新的SomeOtherException

于 2014-08-13T00:03:10.840 回答