簡體   English   中英

Scala:鏈接期貨,返回第一個

[英]Scala: Chaining futures, returning the first

我有一個我擁有Future[Something]的場景: a 成功時需要觸發第二個Future[Unit]b 我想將ab鏈在一起,但我只關心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
}

但這不能將updateaudit的生命周期聯系在一起。 例如,當我Await.result(service.updateSomething(...), duration) ,無法保證repository.audit未來已完成。

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

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

您也可以使用更友好的形式:

execudeA().flatMap(a =>
  executeB().recover { case e => println(e); () }.map(_ => a)
)

另外,您可以使用val

val = a <- executeA()
a.andThen{ case _ => executeB(b).recover{case e => println(e)} }
a //and return a 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM