如何将此转换为使用Futures,不确定如何使用Future.Traverse

时间:2015-12-24 18:15:03

标签: scala future

我有以下未返回期货的旧代码,但它现在是:

for (rg <- effectedRoleGroups) {
        val pm = securityService.generateABC(rg.id)
        redisService.setABC(rg.id, pm)
      }

现在securityService和redisService都返回Futures。

我知道我可以这样做:

for {
result <- Future.traverse(effectedRoleGroups)(rg -> securityService.generateABC(rg.id)
}

但我不确定如何在这种情况下使用结果传递给我的其他服务。

2 个答案:

答案 0 :(得分:1)

假设你想在使用foreach循环时忽略Futures的结果,你可以这样做:

for (rg <- effectedRoleGroups) {
  for {
    pm <- securityService.generateABC(rg.id)
    _ <- redisService.setABC(rg.id, pm)
  } yield ()
}

相当于:

for (rg <- effectedRoleGroups) {
  securityService.generateABC(rg.id).flatMap(pm => redisService.setABC(rg.id, pm))
}

使用Future.traverse

val results: Future[List[ResultFromRedis]]] = Future.traverse(effectedRoleGroups)(rg => 
  securityService.generateABC(rg.id).flatMap(pm => redisService.setABC(rg.id, pm)))

这将为您提供Future ListredisService.setABC将产生的结果。

答案 1 :(得分:0)

Future.traverse(..some traversable..)(...) 

返回转换遍历的Future。 所以你实际上不需要在这里使用。相反,你可以这样做:

 val resultFuture = Future.traverse(effectedRoleGroups)(rg -> securityService.generateABC(rg.id))

如果您仍想使用 ,则需要 yield 运算符:

val resultFuture = for {
  result <- Future.traverse(effectedRoleGroups)(rg -> securityService.generateABC(rg.id))
} yield result