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