我正在尝试进行两个api调用并将其合并,将第二个结果分配给第一个。最初,我在考虑使用<input type="reset" value="Reset" />
,但对于第二个电话,我需要第一个电话的响应中的用户ID:
zipWith
用户对象如下:
@GET("users")
fun getUsers(): Single<List<User>>
@GET("users/{userId}/repos")
fun getUserRepositories(@Path("userId") userLogin: String): Single<List<Repository>>
因此,我想获取用户列表,然后为每个用户获取其存储库列表,并将这些存储库分配给该用户。我进行了一些研究,并使用data class User(
val id: Int,
val login: String,
val repositories: List<Repository>
)
找到了solution for similar problem。现在,我想做这样的事情,但就我而言,我有对象列表作为第一个请求的响应,我不知道如何以一种好的方式来处理它。我现在想出了这样的东西:
flatMap
它确实有效,但是我觉得这不是最好的方法。有谁知道如何通过更好,更清洁的解决方案来实现这一目标?
答案 0 :(得分:2)
您必须使用publish
方法:
data class Repository(
val name: String
)
data class User(
val id: Int,
val login: String,
val repositories: List<Repository>
)
interface Api {
fun getUsers(): Single<List<User>>
fun getUserRepositories(id: Int): Single<List<Repository>>
}
fun getApi(): Api {
TODO()
}
fun getUsers(): Single<List<User>> {
val api: Api = getApi()
return api
.getUsers()
.toObservable()
.flatMapIterable { it }
.publish { user ->
Observable.zip(
user,
user.flatMap { user -> api.getUserRepositories(user.login).toObservable() },
BiFunction { user, repositories ->
user.copy(repositories = repositories)
}
)
}
.toList()
}