除了map和flatMap之外,如何使用future将异常翻译成另一个

时间:2014-08-12 22:50:07

标签: scala scala-2.9

我们目前有这样的代码

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中创建一个承诺和连接到那个承诺,还是我完全不在这里? (我想知道是否有更简单的方法,或者我可以尝试沿着这条路走下去。)

1 个答案:

答案 0 :(得分:6)

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

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

如果我们的未来成功,flatMap将生效,recoverWith不会做任何事情,因为它的部分功能不匹配。如果flatMaprecoverWith不会发生并且flatMap因为PF不匹配而无法执行任何操作时,未来会因非TimeoutException而失败。如果由于TimeoutException而失败,则recoverWith将不会发生,SomeOtherException将启动并将其转换为包含新{{1}}的失败的未来