[英]Scala: Chaining futures, returning the first
我有一个我拥有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
未来已完成。
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.