我想结合两个API请求的结果 . 最初我让他们返回Observable,但要正确执行它我猜应该是单一的响应 .
这是我最初的Retrofit interefaces:
interface RemoteGeocodingService {
@GET("json")
fun requestCityAddressByName(
@Query("address") address: String
): Observable<LocationResponse>
}
interface RemoteWeatherService {
@GET("{latitude},{longitude}")
fun requestWeatherForCity(
@Path("latitude") latitude: String,
@Path("longitude") longitude: String
): Observable<WeatherResponse>
}
我正在使用lambda将它们的结果组合在一起:
override fun getWeather(cityName: String): Observable<WeatherDetailsDTO>? {
return remoteWeatherDataSource.requestCityAddressByName(cityName)
.flatMap({ responseFromServiceA -> remoteWeatherDataSource.requestWeatherForCity(responseFromServiceA.results[0].geometry.location.lat.toString(), responseFromServiceA.results[0].geometry.location.lng.toString()) },
{ responseFromServiceA, responseFromServiceB ->
TransformersDTO.transformToWeatherDetailsDTO(responseFromServiceA.results[0].formatted_address, responseFromServiceB)
})
.retry()
}
但是,当我将每个API接口方法的请求结果更改为使用Single而不是Observable时,我无法执行此操作 - 我在Android Studio IDE编辑器中收到错误 . 这是我试过的:
override fun getWeather(cityName: String): Single<WeatherDetailsDTO> {
return remoteWeatherDataSource.requestCityAddressByName(cityName)
.flatMap({ responseFromServiceA: LocationResponse -> remoteWeatherDataSource.requestWeatherForCity(responseFromServiceA.results[0].geometry.location.lat.toString(), responseFromServiceA.results[0].geometry.location.lng.toString()) },
{ responseFromServiceA: LocationResponse, responseFromServiceB: WeatherResponse ->
TransformersDTO.transformToWeatherDetailsDTO(responseFromServiceA.results[0].formatted_address, responseFromServiceB)
})
.retry()
IDE标记为错误.flatMap运算符并说:
使用提供的参数不能调用以下任何函数 . flatMap(((t:LocationResponse)→SingleSource!)!)其中R无法推断出有趣的flatMap(mapper:((t:LocationResponse)→SingleSource!)!):单身!在io.reactivex.Single flatMap(Function!>!)中定义,其中R无法推断出有趣的flatMap(mapper:Function!>!):Single!在io.reactivex.Single中定义
怎么解决?
1 回答
没有
Single.flatMap(Function, BiFunction)
方法 . 您必须映射到内部结果以使项目配对: