Scala: цепочка фьючерсов, возвращение первого - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть сценарий, в котором у меня есть Future[Something]: a, который в случае успеха должен вызвать секунду Future[Unit]: b.Я хочу соединить a и b вместе, но меня волнует только то, что a будет успешным.если b терпит неудачу, я могу просто зарегистрировать ошибку и оставить ее так:

Пока у меня есть:

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
}

Но это не связывает жизненные циклы update иaudit вместе.например, когда я Await.result(service.updateSomething(...), duration) не гарантирую, что будущее repository.audit завершено.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Также вы можете использовать более дружественную форму:

execudeA().flatMap(a =>
  executeB().recover { case e => println(e); () }.map(_ => a)
)
0 голосов
/ 11 декабря 2018

flatMap твой друг.Вы можете просто использовать для понимания + восстановления:

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