考虑集群的主/从选举模型。
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.这种重复映射future的方法是否是在scala中进行异步编程的正确方法?我知道用Actor范式可以用不同的方式写这本书,并且可能要好得多,但是就OOP而言,这是Scala最好的方法吗?
谢谢。
当您已经手持成员时,为什么要执行MemberDao.findById?(您也将退货视为会员,而退货实际上应该是Option [Member])。另外,update不需要将id用作单独的参数(在里面有一个可用的member
)。您不需要Await
结果,因为您的函数正在返回Future
,并且您不需要返回Boolean
:只需抛出一个异常即可表明失败。考虑这样的事情:
def demoteAllMembers: Future[Unit] = memberDao.all.flatMap {
Future.sequence(_.foreach {
memberDao.update(_.copy(isMaster = false))
})
}.map ( _ => () )
不是所有的东西都肿了,是吗?:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句