2015-12-24 47 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