播放framework和scala未来链让它更漂亮

ztyzrc3y  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(375)

我用 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个内部函数。

hmae6n7t

hmae6n7t1#

这正是斯卡拉所面临的情况 for -理解是为了帮助你。您可以将代码替换为以下内容:

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

…编译器将把它分解成完全相同的东西。你可以阅读更多关于 for -在这里理解,但简而言之,任何时候你发现自己有一个长长的链条 flatMap 打电话(也许还有 map 最后),您应该考虑将它们重写为 for -理解,通过折叠深层嵌套使代码更具可读性。

相关问题