我们目前有这样的代码
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中创建一个承诺和连接到那个承诺,还是我完全不在这里? (我想知道是否有更简单的方法,或者我可以尝试沿着这条路走下去。)
答案 0 :(得分:6)
您可能需要查看recoverWith
因为它允许您将Throwable
转换为另一个Future
,这可能是失败或成功,具体取决于您的需求处理它。这比常规recover
更灵活一点,因为您不必总是在转换中返回成功的结果。所以你可以这样做:
val newFuture = fut.flatMap(doSomething).recoverWith{
case t:TimeoutException => Future.failed(new SomeOtherException("timeout!!!"))
}
如果我们的未来成功,flatMap
将生效,recoverWith
不会做任何事情,因为它的部分功能不匹配。如果flatMap
在recoverWith
不会发生并且flatMap
因为PF不匹配而无法执行任何操作时,未来会因非TimeoutException而失败。如果由于TimeoutException而失败,则recoverWith
将不会发生,SomeOtherException
将启动并将其转换为包含新{{1}}的失败的未来