我有以下未返回期货的旧代码,但它现在是:
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)
}
但我不确定如何在这种情况下使用结果传递给我的其他服务。
答案 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
List
个redisService.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