按顺序发出具有不同请求正文的多个 API 请求



用例:我需要使用android客户端(改造(在服务器中发送一些请求。在我得到第一个答案后,我需要更新发送对象值(取决于我得到的最后一个项目(并重新发送它,直到下载所有数据。我想知道如何通过 Retrofit 和 RxJava 实现这一点(我不想在循环等时使用(

编辑: 问题是,我不知道"平面地图"的确切数量,因为数据可能会变大或变小。我有 420000 条记录,对于每个请求,我都会加载 1000 个数据

您可以使用it参数(即前一个的响应(flatMap它们,并在下一个参数中使用它的响应。

mathApi.multiplyByTwo(1)
.flatMap {
mathApi.multiplyByTwo(it)
}.flatMap {
mathApi.multiplyByTwo(it)
}.subscribe {
// here "it" will be 4 (1*2*2) 
}

如果你不知道你最终会有多少flatMap,你可以,例如,使用递归函数来做到这一点。

private fun multiplyByTwo(number: Int) {
mathApi.multiplyByTwo(number).subscribe {
if (it < Integer.MAX_VALUE) { // When you run out of data.
multiplyByTwo(it)
}
}
}

您可以使用保存可变状态的 generate 函数:

data class ApiResponse(
val nextPage: Int? = null
)
data class GeneratorState(
var lastResponse: ApiResponse
)
fun makeApiCall(page: Int): ApiResponse {
return ApiResponse(page + 1)
}
Flowable
.generate(
Callable { GeneratorState(makeApiCall(0)) },
BiConsumer { state: GeneratorState, emitter: Emitter<ApiResponse> ->
val latest = state.lastResponse
if (latest.nextPage != null) {
val response = makeApiCall(latest.nextPage)
state.lastResponse = response
emitter.onNext(response)
} else {
emitter.onComplete()
}
})
.subscribe(object : FlowableSubscriber<ApiResponse> {
var subscription: Subscription? = null
override fun onSubscribe(s: Subscription) {
subscription = s
s.request(1)
}
override fun onNext(response: ApiResponse) {
println("onNext :$response")
if (response.nextPage != null && response.nextPage < 10) {
subscription?.request(1)
} else {
subscription?.cancel()
}
}
override fun onComplete() {
println("Completed")
}
override fun onError(t: Throwable) {
t.printStackTrace()
}
})

相关内容

  • 没有找到相关文章

最新更新