首页 > 解决方案 > Scala:链接期货,返回第一个

问题描述

我有一个场景,我有一个Future[Something]:成功时a需要触发第二个: 。我想链接在一起,但我只关心成功。如果失败,我可以记录一个错误并将其保留:Future[Unit]babab

到目前为止,我有:

def updateSomething(something: Something): Future[Something] = {
    val eventual: Future[Something] = repository.update(something)
    eventual.onSuccess({
      case updated =>
        repository.audit(updated.id, "Update successful")
          .onFailure({
            case throwable: Throwable => Logger.error("Audit failed", throwable)
          })
        Logger.info("Update Complete")
    })
    eventual
}

但这并没有将 theupdate和 the的生命周期联系audit在一起。例如,当我Await.result(service.updateSomething(...), duration)无法保证repository.audit未来已经完成时。

标签: scalafuture

解决方案


flatMap是你的朋友。您可以只使用理解+恢复:

for {
  a <- executeA()
  _ <- executeB(b).recover{case e => println(e); Future.unit } // awaits B to complete
} yield a

推荐阅读