,如果我得到它的權利,我不知道,但我相信,你可以使用上RxJava SyncOnSubscribe.createStateful
來解決這個問題。
看看我的樣品:
class SimpleTest {
@Test
fun testRequestTenPages() {
getPaginatedDataFromApi()
.take(10)
.subscribe { println(it) }
}
fun apiCall(previous: Response? = null) : Response {
return previous?.let {
val newPage = it.page + 1
previous.copy(id = "${it.id}_$newPage", page = newPage)
} ?: Response("1", 1)
}
fun getPaginatedDataFromApi(): Observable<Response> {
val syncOnSubscribe = SyncOnSubscribe.createStateful<Response?, Response>(
{ null },
{ previous, observer ->
val response = apiCall(previous)
observer.onNext(response)
[email protected] response
}
)
return Observable.create(syncOnSubscribe)
}
data class Response(val id: String, val page: Int)
}
我創建一個有狀態的觀察到這使最後一個響應的狀態用它來生成一個響應。
運行這個測試,你會看到下面的輸出:
Response(id=1, page=1)
Response(id=1_2, page=2)
Response(id=1_2_3, page=3)
Response(id=1_2_3_4, page=4)
Response(id=1_2_3_4_5, page=5)
Response(id=1_2_3_4_5_6, page=6)
Response(id=1_2_3_4_5_6_7, page=7)
Response(id=1_2_3_4_5_6_7_8, page=8)
Response(id=1_2_3_4_5_6_7_8_9, page=9)
Response(id=1_2_3_4_5_6_7_8_9_10, page=10)
你仍然可以使用「遞歸」的解決方案,具有一定的異步操作界面增強 - 例如'Flowable.observeOn(Schedulers.io())' - 內部'Flowable'調用 –
Web服務API是否阻塞或返回Observable?問題是,爲了使用API,需要等待前一個結果完成以請求下一個結果。如果你願意阻止,那麼解決方案很容易。 – hgrey