首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rx Kotlin retryWhen问题

Rx Kotlin retryWhen问题
EN

Stack Overflow用户
提问于 2019-06-20 11:57:00
回答 1查看 1.1K关注 0票数 0

我正在尝试使用.retryWhen()操作在失败的情况下每5秒重试一个api调用3次。有人能帮我处理一下这个案子吗?因为我在过去几个小时里弄不清楚。

代码语言:javascript
复制
.retryWhen { errors ->
                errors
                    .zipWith(Observable.range(1, 3), { _: Throwable, i: Int -> i })
                    .flatMap { retryCount: Int ->
                        Observable.timer(
                            5.0.pow(retryCount.toDouble()).toLong(),
                            TimeUnit.SECONDS
                        )
                    }
            }

我得到了

代码语言:javascript
复制
None of the following functions can be called with the arguments supplied:
@CheckReturnValue @SchedulerSupport public final fun <U : Any!, R : Any!> zipWith(p0: ((Observer<in Int!>) -> Unit)!, p1: ((Throwable, Int) -> ???)!): Observable<(???..???)>! defined in io.reactivex.Observable
@CheckReturnValue @SchedulerSupport public final fun <U : Any!, R : Any!> zipWith(p0: ObservableSource<out Int!>!, p1: BiFunction<in Throwable!, in Int!, out (???..???)>!): Observable<(???..???)>! defined in io.reactivex.Observable
@CheckReturnValue @SchedulerSupport public final fun <U : Any!, R : Any!> zipWith(p0: (Mutable)Iterable<(???..???)>!, p1: BiFunction<in Throwable!, in (???..???), out (???..???)>!): Observable<(???..???)>! defined in io.reactivex.Observable
@CheckReturnValue @SchedulerSupport public final fun <U : Any!, R : Any!> zipWith(p0: (Mutable)Iterable<Int!>!, p1: ((Throwable, Int) -> ???)!): Observable<(???..???)>! defined in io.reactivex.Observable

我还粘贴了我试图执行的全部代码:

代码语言:javascript
复制
private fun getOrderDetails(uuid: String) {
        apiClient.getOrderDetailsUsingUUID(uuid)
            .retryWhen { errors ->
                errors
                    .zipWith(Observable.range(1, 3), { _: Throwable, i: Int -> i })
                    .flatMap { retryCount: Int ->
                        Observable.timer(
                            5.0.pow(retryCount.toDouble()).toLong(),
                            TimeUnit.SECONDS
                        )
                    }
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ webOrderRequest ->
                _currentOrder.value = OrderState.OrderDetails(webOrderRequest.order!!)
                orderStatus(uuid, webOrderRequest.order)
            },
                { error ->
                    _currentOrder.value = OrderState.Error(getErrorMessage(error))
                    Log.e(TAG, getErrorMessage(error))
                }
            )
    }
EN

回答 1

Stack Overflow用户

发布于 2019-06-21 06:17:56

我想有人在找类似的东西。我想出了一个对我有用的解决方案。

代码语言:javascript
复制
.retryWhen { errors ->
                errors.zipWith(Observable.range(1, 3), BiFunction { throwable: Throwable, count: Int -> Pair(throwable, count) })
                    .flatMap { count: Pair<Throwable, Int> ->
                        if (count.second < 3) {
                            Observable.timer(5, TimeUnit.SECONDS)
                        } else {
                           Observable.error(count.first)
                        }
                    }
            }

它的扩展:

代码语言:javascript
复制
import io.reactivex.Observable
import io.reactivex.functions.BiFunction
import java.util.concurrent.TimeUnit

fun <T> Observable<T>.retryWhenError(retryCount: Int, delayInSeconds: Long): Observable<T> {
    return retryWhen { errors ->
        errors.zipWith(
            Observable.range(1, retryCount), BiFunction { throwable: Throwable, count: Int -> Pair(throwable, count) })
            .flatMap { count: Pair<Throwable, Int> ->
                if (count.second < retryCount) {
                    Observable.timer(delayInSeconds, TimeUnit.SECONDS)
                } else {
                    Observable.error(count.first)
                }
            }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56685471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档