是否可以在地图内部的地图内重构地图

时间:2015-12-17 04:02:23

标签: scala future

我的服务层正在返回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,我的代码可能会有意想不到的问题,所以最好把它当作未来?

1 个答案:

答案 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