【发布时间】:2016-02-29 21:43:41
【问题描述】:
考虑一个用于集群主/从选举的模型。
Member{ id: Long, isMaster: Boolean }
我有一个带有以下方法的 Dao/Repo:
MemberDao.findById(id:Long):Future[Option[Member]]
MemberDao.update(id:Long, member: Member):Future[Unit]
MemberDao.all() : Future[List[Member]]
在 MemberService 中,我正在尝试编写一个函数来将所有现有成员的 isMaster 设置为 false,我最终得到了这个疯狂臃肿的代码:
class MemberService ... {
def demoteAllMembers() : Future[Boolean] = {
val futures = memberDao.all.map{ memberFuture =>
memberFuture.map{ member =>
memberDao.findById(member.id).map { existingMemberFuture =>
existingMemberFuture.map { existingMember =>
memberDao.update(existingMember.id, existingMember.copy(isMaster = false)
}
}
}
val results = Await.result(futures, 10 seconds)
// return something here
}
}
}
我的问题是: 1、return语句应该如何写来处理成功/错误?例如成功时返回 Future(true) 失败时返回 Future(false) 2.这种重复映射未来的方式是在scala中进行异步编程的正确方式吗?我知道这可以在 Actor 范式中以不同的方式编写,并且可能更好,但是在 OOP 的情况下,这是 Scala 可以做到的最好的吗?
谢谢。
【问题讨论】:
标签: scala concurrency playframework future