play框架和scala Future(s)链。让它更漂亮

问题描述 投票:2回答:1

我使用WSClient来提出休息请求。每个请求返回一些Future

结果我需要发出请求1并获取一些数据。然后我需要使用来自请求1的结果的数据来请求2.然后我需要使用来自请求2的结果的数据来请求3,依此类推

在我的代码中它看起来像

def wsChain(data: Data): Future[NewData] = {
    getOne(data).flatMap(data2 => {
      getTwo(data2).flatMap(data3 => {
        getThree(data3).flatMap(data4 => {
          getFour(data4).map(result => foo(result))
        })
      })
    })
  }

这是非常原始的样本,没有任何响应和请求的修改。但我认为即使很难阅读。我现在关于AwaitFuture,但它是反模式

可能我可以做得更漂亮吗?没有N个内部函数。

scala playframework future ws-client
1个回答
9
投票

这正是Scala的for-comprehensions旨在帮助的情况。您可以使用以下代码替换代码:

def wsChain(data: Data): Future[NewData] = for {
  data2  <- getOne(data)
  data3  <- getTwo(data2)
  data4  <- getThree(data3)
  result <- getFour(data4)
} yield foo(result)

......并且编译器将完全相同的东西放弃它。你可以阅读更多关于for-comprehensions here的内容,但简而言之,任何时候你发现自己有一长串flatMap调用(最后可能是map),你应该考虑将它们重写为for-comprehension,这使你的通过折叠深层嵌套使代码更具可读性。

© www.soinside.com 2019 - 2024. All rights reserved.