在 Scala 中将 Future[Unit] 变成 Try[Unit]

Turn a Future[Unit] into a Try[Unit] in Scala

我正在尝试实现一个 API 方法(AsyncWriteJournal.asyncWriteMessages – Akka 2.4 持久性的一部分 API),这需要我 return Future[Seq[Try[Unit]]]。这个想法是可以执行许多操作,其中任何一个都可能单独成功或失败,未来可以用来等待所有操作的完成。未来本身可以选择成功,即使在个别操作中有一定的 class 失败。

我正在使用的基础操作 (Rediscala) return Futures 但我一直在尝试将 Seq[Future[Unit]] 转换为所需的 return 类型。我可以在每个操作上使用 Promise 并将它们与 Future.sequence 捆绑在一起,但是如果 any 操作失败,则结果未来会失败,这是不正确的行为

如果你把一个可能失败的未来变成一个无论如何都会成功的未来,然后使用 Future.sequence 呢?

这是你想要的吗?

def transform(ops: Seq[Future[Unit]])(implicit ec: ExecutionContext): Future[Seq[Try[Unit]]] =
  Future.sequence(ops.map (
    _.map(Success(_)).recover {
      case ex => Failure(ex)
    }
  ))