我们目前有这样的代码
def somemethod() : Future[Resp] = {
val responseFuture = service.serveV2(req)
val nextFuture = responseFuture flatMap {
//do something on success including call to next async service
}
nextFuture
}
Run Code Online (Sandbox Code Playgroud)
当然,超时时会跳过映射,但我需要将该超时转换为适当的异常,我可以将其传递给我们的Web框架以返回正确的响应代码.如何在scala中执行此操作?
另外值得注意的是,我需要回归那个未来.也许我应该在responseFuture.onFailure中创建一个承诺和连接到那个承诺,还是我完全不在这里?(我想知道是否有一种更简单的方法,或者我可以尝试沿着这条路走下去).
你可能想要看一下,recoverWith因为它允许你把一个Throwable变成另一个Future可能是失败或成功的,这取决于你想要如何处理它.这比常规更灵活recover,因为您不必总是在转换中返回成功的结果.所以你可以这样做:
val newFuture = fut.flatMap(doSomething).recoverWith{
case t:TimeoutException => Future.failed(new SomeOtherException("timeout!!!"))
}
Run Code Online (Sandbox Code Playgroud)
如果我们获得了成功的未来,那么flatMap它将生效,并且recoverWith不会做任何事情,因为它的部分功能将不匹配.如果未来会因为非TimeoutException而失败,flatMap并且不会发生recoverWith任何事情,并且由于PF不匹配而无法执行任何操作.如果它由于TimeoutException而失败,那么flatMap就不会发生这种情况,并且它recoverWith会启动并将其转变为一个失败的未来SomeOtherException
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |