我使用 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/