2015-12-17 45 views
0

我的服務層正在返回期貨。 我目前這個爛攤子:是否有可能重構地圖內的地圖內的地圖

userService.getAll().map { users => 
    for(u <- users) { 
    groupService.getByUserId(u.id).map { 
     blockingService.call(u) 
     otherService.bar(u.id).map { 
     lastService.foo(u.id) 
     } 
    } 
    } 
} 

我可以採用某種打掃一下嗎?它有太多的嵌入式地圖調用。

我也很害怕,如果將來我重構我的代碼,使blockingService.call因爲未來基礎,我的代碼將有潛在的意想不到的問題,所以更好地把它當作未來?

回答

3

與更換嵌套map S表示理解:

def doSomethingWithUser(u: User) = { 
    for { 
     _ <- groupService.getByUserId(u.id) 
     _ <- Future(blockingService.call(u)) // Notice Future.apply here. 
     _ <- otherService.bar(u.id) 
     result <- lastService.foo(u.id) 
    } yield result 
    } 

    for { 
    users <- userService.getAll() 
    results <- Future.traverse(users)(doSomethingWithUser) // Notice Future.traverse here. 
    } yield results 
+0

http://docs.scala-lang.org/tutorials/FAQ/yield.html – danielnixon

+0

哇,感謝的人。我需要得到一隻雞教我這個東西:) – Blankman

+1

一隻雞 - 所以你可以看到這種方式編碼內臟? – Shadowlands