定期调用一个可观察对象并仅在下一个成功时切换到下一个
Periodically call an observable and switch to next one only when next one succeeds
我需要每秒轮询一次端点,目前我使用
Observable.interval(0, 1, TimeUnit.SECONDS, ioScheduler)
.switchMap { return pollWithRetrofit() }
它工作正常,除非调用开始花费超过 1 秒的时间来处理,因此在我得到任何响应之前 swithMap
取消了改造订阅。它可以连续发生多次,有效地让客户端在很长一段时间内没有任何来自轮询调用的响应。在这种情况下,我希望在收到下一次呼叫的响应之前不取消改装呼叫。
我知道当基本订阅产生 onNext
调用时 switchMap
取消了之前的订阅,目前它在 Observable.interval
每秒发生一次,所以我的想法是取消之前的调用仅当改造调用它时 onNext
,即将开关向前移动反应链一步。
我该怎么做?或者有其他解决方案吗?
您可以使用 onBackpressureDrop
和 flatMap
且 maxConcurrency 为 1 以确保仍允许更长的调用成功:
Flowable.interval(0, 1, TimeUnit.SECONDS, ioScheduler)
.onBackpressureDrop()
.flatMap(v -> pollWithRetrofit(), 1);
fwiw 我正在使用类似下面的代码来做类似的事情...我也不完全相信这是最干净的方法(尽管现在已经成功工作了一段时间)
someRetrofitInterface.apiCall()
.repeatWhen { completed -> completed.delay(30, TimeUnit.SECONDS) }
.retry(3)
我需要每秒轮询一次端点,目前我使用
Observable.interval(0, 1, TimeUnit.SECONDS, ioScheduler)
.switchMap { return pollWithRetrofit() }
它工作正常,除非调用开始花费超过 1 秒的时间来处理,因此在我得到任何响应之前 swithMap
取消了改造订阅。它可以连续发生多次,有效地让客户端在很长一段时间内没有任何来自轮询调用的响应。在这种情况下,我希望在收到下一次呼叫的响应之前不取消改装呼叫。
我知道当基本订阅产生 onNext
调用时 switchMap
取消了之前的订阅,目前它在 Observable.interval
每秒发生一次,所以我的想法是取消之前的调用仅当改造调用它时 onNext
,即将开关向前移动反应链一步。
我该怎么做?或者有其他解决方案吗?
您可以使用 onBackpressureDrop
和 flatMap
且 maxConcurrency 为 1 以确保仍允许更长的调用成功:
Flowable.interval(0, 1, TimeUnit.SECONDS, ioScheduler)
.onBackpressureDrop()
.flatMap(v -> pollWithRetrofit(), 1);
fwiw 我正在使用类似下面的代码来做类似的事情...我也不完全相信这是最干净的方法(尽管现在已经成功工作了一段时间)
someRetrofitInterface.apiCall()
.repeatWhen { completed -> completed.delay(30, TimeUnit.SECONDS) }
.retry(3)