【问题标题】:play framewoerk & scala Future(s) chain. make it more pretty玩 framewoerk & scala Future(s) 链。让它更漂亮
【发布时间】:2019-07-15 06:06:45
【问题描述】:

我使用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))
        })
      })
    })
  }

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

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

【问题讨论】:

    标签: scala playframework future ws-client


    【解决方案1】:

    这正是 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,通过折叠深层嵌套使您的代码更具可读性。

    【讨论】:

      猜你喜欢
      • 2018-06-20
      • 2018-04-16
      • 2020-11-21
      • 1970-01-01
      • 2018-08-15
      • 2020-08-13
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      相关资源
      最近更新 更多