为了理解而忽略失败的未来
Ignore failing future in for comprehension
我对所有进行远程服务调用(REST、RPC 等)的期货有一定的了解。如果其中一个 future 失败了,那么整个 for 理解也会失败吗?
例如,假设我有两个调用服务的 future
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
}
是的,如果第二个未来如写的那样失败,整个for-comprehension就会失败。像这样简单的事情会奏效吗?
for {
service1Response <- service1Future
service2Response <- service2Future.recoverWith(...)
} yield {
...
}
一种方法是 return Future[Try[Response]]
而不是 Future[Response]
。在 recoverWith
中你会 return Future(Failure(e))
。然后,您可以在 yield
中进行模式匹配以查看它是否成功。
我对所有进行远程服务调用(REST、RPC 等)的期货有一定的了解。如果其中一个 future 失败了,那么整个 for 理解也会失败吗?
例如,假设我有两个调用服务的 future
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
}
是的,如果第二个未来如写的那样失败,整个for-comprehension就会失败。像这样简单的事情会奏效吗?
for {
service1Response <- service1Future
service2Response <- service2Future.recoverWith(...)
} yield {
...
}
一种方法是 return Future[Try[Response]]
而不是 Future[Response]
。在 recoverWith
中你会 return Future(Failure(e))
。然后,您可以在 yield
中进行模式匹配以查看它是否成功。