我的服务层正在返回Futures。 我现在有这个烂摊子:
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因为基于Future,我的代码可能会有意想不到的问题,所以最好把它当作未来?
答案 0 :(得分:3)
使用for comprehension替换嵌套的map
:
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