如何将其转换为使用 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)))
这会给你 Future
的 List
个结果,redisService.setABC
会产生。
我有以下以前不返回期货的旧代码,但现在是:
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)))
这会给你 Future
的 List
个结果,redisService.setABC
会产生。