case class ThirdPartyProvidersResponse(providers: List[ThirdPartyProvider])
case class ThirdPartyProvider(
id: String,
config: List[Config]
)
// Convert ThirdPartyProvidersResponse to DomainProvidersResponse
case class DomainProvidersResponse(
providers: List[DomainProviderResponse]
)
case class DomainProviderResponse(
code: Option[DomainProviderType],
enabled: Boolean
)
这是我尝试实现的方法签名:
def getProviders(): Future[DomainProvidersResponse]
这是API方法的定义:
def getProvidersList(): Future[ThirdPartyProvidersResponse]
这是我尝试过的:
def getProviders(): Future[DomainProvidersResponse] = {
var providers: List[DomainProviderResponse] = List()
thirdPartyServiceHttpClient.getProvidersList().map { response =>
response.providers.map { providersList =>
val provider = DomainProviderResponse(
providerCode = DomainProviderType.findByName(providersList.id),
enabled = true
)
providers :+= provider
}
}
Future.successful(DomainProvidersResponse(providers = providers))
}
这段代码的问题是同步。我需要等待 future 执行之后才能返回结果。我们可以使用 flatMap
通过立即执行转换而无需显式同步来实现此目的吗?对此的任何帮助表示赞赏。我有 Java 背景,是 Scala 新手。
map
或理解的东西:
def getProviders(): Future[DomainProvidersResponse] =
for {
response <- thirdPartyServiceHttpClient.getProvidersList()
domainProviders = response.providers.map { provider =>
DomainProviderResponse(
providerCode = DomainProviderType.findByName(providersList.id),
enabled = true
)
}
} yield DomainProvidersResponse(domainList)
// or
def getProviders(): Future[DomainProvidersResponse] =
thirdPartyServiceHttpClient.getProvidersList().map { response =>
response.providers.map { provider =>
DomainProviderResponse(
providerCode = DomainProviderType.findByName(providersList.id),
enabled = true
)
}
}.map { domainProviders =>
DomainProvidersResponse(domainList)
}