2015-12-24 19 views
0

我以前不返回期货以下旧代码,但它现在是:如何将其转换为使用期货,不知道如何使用Future.Traverse

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

现在securityService和redisService都是返回期货。

我知道我能做到这一点:

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

但我不知道我怎么会用,结果在这种情况下,传递给我的其他服务。

+0

究竟是什么影响了罗尔集团? –

+0

请澄清,如果你想*你的*函数返回一个未来,或者如果你想它等待它调用的函数的结果并返回一个常规值。 –

+0

我希望它是非阻塞的。我想以某种方式执行我最初在我的'''中执行的操作(rg < - affectedRoleGroups)...'''语句,但现在我的服务正在返回未来。 – Blankman

回答

1

Asuming你想为你使用foreach循环可以忽略期货的结果做到这一点是这样的:

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

这会给你的结果redisService.setABC将产生的ListFuture

+0

谢谢你的工作。但是在你的第一个片段中,你在补考中没有收益,我必须回报正确的东西?如果我没有把一个例如单位 – Blankman

+0

是的,你是对的,我忘了。 –

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

回报的未来转化穿越。 所以你实际上不需要在这里使用。相反,你可以这样做:

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

如果你仍然想使用你需要产量操作:

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

但是,如何使用结果传递给redisServie.setABC(rg.id,pm)? – Blankman