为了理解而忽略失败的未来

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 中进行模式匹配以查看它是否成功。