RxJava使用第一个可观察的结果和第二个可观察的结果运行两个可观察的结果列表

时间:2020-04-11 19:22:13

标签: kotlin observable rx-java rx-java2

我正在尝试进行两个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

它确实有效,但是我觉得这不是最好的方法。有谁知道如何通过更好,更清洁的解决方案来实现这一目标?

1 个答案:

答案 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()
}