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

How to convert this to using Futures, not sure how to use Future.Traverse

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

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)
}

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

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

returns 转换后的可遍历对象的未来。 所以你实际上不需要在这里使用 for。相反,您可以这样做:

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

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

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

假设您想在使用 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)))

这会给你 FutureList 个结果,redisService.setABC 会产生。