2

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

结果我需要提出请求1并获取一些数据。然后我需要使用请求1结果中的数据发出请求2。然后我需要使用request 2结果中的数据发出 request 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))
        })
      })
    })
  }

这是非常原始的示例,没有对响应和请求进行任何修改。但我认为即使它很难阅读。我现在大约Awaitfor Future,但它是反模式

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

4

1 回答 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的更多信息,但简而言之,任何时候您发现自己有一长串调用(可能最后是 a),您应该考虑将它们重写为-comprehensions,这使您的代码更具可读性破坏深层嵌套。flatMapmapfor

于 2019-02-21T11:03:58.610 回答