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

标签 scala playframework future ws-client

我使用 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 for Future,但它是反模式

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

最佳答案

这正是 Scala 的 for 推导式旨在帮助解决的情况。您可以将代码替换为以下内容:

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

...编译器会将其脱糖为完全相同的东西。您可以阅读有关 for 推导式 here 的更多信息。 ,但简而言之,任何时候您发现自己有一长串 flatMap 调用(最后可能还有一个 map),您应该考虑将它们重写为 >for-理解,通过折叠深层嵌套使您的代码更具可读性。

关于scala - 玩框架和 scala Future(s) 链。让它更漂亮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54805176/

相关文章:

java - 如何避免 Mongodb 中重复的对象条目?

Java Future.isDone 返回 true,即使它不应该返回 true,这会停止程序进程

scala - 无法使 Spark 在 Intellij Idea 中的 scala 工作表内运行

scala - 当客户端 actor 与远程 actor 断开连接时如何禁用 Akka 错误消息?

linux - 无法安装 Play 2.0 支持 - INTELIJ 12

java - 终止并向 Executor 提交可调用对象

Scala Future 用于理解 : sequential vs parallel

scala - 如何在 SBT 多项目中共享自定义任务

scala - 了解隐式 < :< parameter

scala - 在 Play 2.5.2 中注入(inject)当前应用