2017-08-10 46 views
2

我有理解所有远程服务调用(REST,RPC等)的期货。如果其中一个未来失败,整个理解是否会失败?忽略失败的未来理解

举例来说,假设我有两个期货,使服务调用

val service1Future: Future[Response] = ... 
val service2Future: Future[Response] = ... 

假设service2Future也有一些recoverWith抛出异常PartialFunction[Throwable, Future[U]]

如果service2Future失败,我真的不在乎。我可以在我的理解中强制执行吗?

for { 
    service1Response <- service1Future 
    service2Response <- service2Future 
} yield { 
    // do stuff with service1Response, but I want to get here even if service2Future fails 
} 
+0

因此,在这种情况下使用理解或flatMap是没有意义的。 – cchantep

回答

1

是,换理解整个就会如果书面第二将来失败失败。这件事会简单吗?

for { 
    service1Response <- service1Future 
    service2Response <- service2Future.recoverWith(...) 
} yield { 
    ... 
} 
+0

如果'def getService2:Future [Result] = { ... code ... someFutureCall.recoverWith(...) }(即返回service2Future的方法已经有一个recoverWith在里面),这是否必要? – Confused

+0

如果它已经有一个'recoverWith',并且传递给'recoverWith'的函数不能失败,那么这不是必须的,并且在你的初始答案中基本的理解能够正常工作。 –

0

一种方法是返回Future[Try[Response]]而不是Future[Response]。在recoverWith你会返回Future(Failure(e))。然后,您可以在yield中匹配模式以查看它是否成功。