scala - Scala:链接期货,返回第一个
问题描述
我有一个场景,我有一个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
}
但这并没有将 theupdate
和 the的生命周期联系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
推荐阅读
- angular - 模块构建失败:错误:调试失败。虚假表达
- python - Python Pandas:导出到 excel 格式一行“粗体”,无条件
- r - 闪亮,R:复选框,geom_hline,ggplot
- node.js - 错误 500:尝试使用 GAE Flexible 将文件上传到 GCS 时出现 ApiError
- c# - 将两个 do while 循环组合成一个或任何更好的重构
- html - 字体系列中的字体有限制吗?
- javascript - 基于Angular中的按钮单击移动文本区域
- scala - 远程 Spark 连接 - Scala:找不到 BlockManagerMaster
- php - Laravel 5.5 和 Vue.js 刀片测试
- php - 在codeigniter中更改登录用户的密码