来自多个Future调用的Scala汇总结果

BZapper

考虑集群的主/从选举模型。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

汇总来自多个记录的数据

来自分类Dev

汇总来自多个SQLite表的分数

来自分类Dev

Rails来自多个表的单个结果

来自分类Dev

收集来自多个柏树的结果

来自分类Dev

MySQL查询结果来自多个条件

来自分类Dev

比较字典的多个值并汇总结果

来自分类Dev

总结来自多个数据帧的向量

来自分类Dev

我是否正确使用 flatMap 来合并来自多个 API 调用的结果?

来自分类Dev

SQL查询汇总来自多个不同表的字段

来自分类Dev

过滤汇总结果

来自分类Dev

选择汇总结果

来自分类Dev

node.js-来自多个调用的流HTTP响应

来自分类Dev

SQL-将来自多个表的汇总数据连接在一起

来自分类Dev

了解蝗虫汇总结果

来自分类Dev

建立汇总结果的总和

来自分类Dev

CUDA线程的汇总结果

来自分类Dev

来自多个线程的cudaEventSynchronize

来自分类Dev

来自多个列表的Countif

来自分类Dev

来自多个列表的UNION

来自分类Dev

来自多个管道的输入

来自分类Dev

来自多个模式的 DWH

来自分类Dev

来自多个 Foreach 的 Linq

来自分类Dev

来自多个表的求和?

来自分类Dev

来自多个表的图表

来自分类Dev

WordPress:多个搜索词或来自多个WP_Queries的合并结果

来自分类Dev

BreezeJS-来自多个linq查询到单个对象的结果

来自分类Dev

合并器是否可以处理来自多个映射器的结果?

来自分类Dev

当结果来自多个连接条件时,如何在cakephp中进行分页

来自分类Dev

在单个单元格中显示来自多个InputBox的结果