【发布时间】:2018-04-10 21:38:10
【问题描述】:
我正在使用一个旅行 API,我首先发出创建会话的请求,然后使用从该 URL 返回的会话 URL 进行调用,直到其状态参数返回 UpdatesComplete。
这是我目前所拥有的:
lateinit var pollUrl: String
travelInteractor.createSession("LHR", "AKL", "2018-04-20", "2018-04-22")
.doOnSubscribe {
loading.postValue(true)
}
.flatMap { url ->
pollUrl = url
travelInteractor.pollResults(pollUrl)
.retryWhen {
it.delay(1000, TimeUnit.MILLISECONDS)
}
}
.doOnNext {
if (it.status != "UpdatesComplete") travelInteractor.pollResults(pollUrl)
.retryWhen {
it.delay(1000, TimeUnit.MILLISECONDS)
}
}
.subscribe({
// Subscription stuff
)}
目前发生的情况是它将调用doOnNext(),然后它会进行网络投票,但我不会捕获订阅,也不会链接另一个投票。有没有更有效的方法可以写这个?
解决方案
感谢iagreen 我设法通过以下方式实现了这一目标:
lateinit var pollUrl: String
travelInteractor.createSession("LHR", "AKL", "2018-04-20", "2018-04-22")
.doOnSubscribe {
loading.postValue(true)
}
.flatMap { url ->
travelInteractor.pollResults(url)
.retryWhen {
it.delay(1000, TimeUnit.MILLISECONDS)
}
.repeatWhen {
it.delay(1000, TimeUnit.MILLISECONDS)
}
.filter {
it.itineraries.map { ... } // Use response here appropriately and then check status
it.status == "UpdatesComplete"
}
.take(1)
}
.subscribe({
// Subscription stuff
)}
【问题讨论】: