-1
extension URLSession {
    fileprivate func loadRepositories(resource: URL) -> Observable<SearchRepositoriesResponse> {
        return self
            .rx.response(request: URLRequest(url: resource))
            .retry(3)
            .map(Repository.parse)
            .retryWhen { $0.delay(1.0, scheduler: MainScheduler.instance) }
    }
}

为什么要retryWhen { $0.delay(1.0, scheduler: MainScheduler.instance) }在最后一步使用?如果我不使用它会怎样?

4

1 回答 1

0

如果Repository.parse返回错误,retryWhen您的代码示例中的 将错误发射延迟 1 秒。恕我直言,在这种情况下使用retryWhen运算符有点误导,因为没有重试发生。它只是延迟错误。

RxFeedback 的 github 页面上的示例代码已更新为新版本,该版本实际上会重试,直到达到最大尝试次数:

extension URLSession {
    fileprivate func loadRepositories(resource: URL) -> Observable<SearchRepositoriesResponse> {

        // The maximum number of attempts to retry before launch the error
        let maxAttempts = 4

        return self
            .rx
            .response(request: URLRequest(url: resource))
            .retry(3)
            .map(Repository.parse)
            .retryWhen { errorTrigger in
                return errorTrigger.flatMapWithIndex { (error, attempt) -> Observable<Int> in
                    if attempt >= maxAttempts - 1 {
                        return Observable.error(error)
                    }

                    return Observable<Int>
                        .timer(Double(attempt + 1), scheduler: MainScheduler.instance).take(1)
                }
        }
    }
}

现在,当Repository.parse返回错误时,retryWhen当未达到最大尝试次数时会导致重试。重试有一个延迟,每次尝试都会变长。当达到最大尝试次数时,它会发出错误并以错误结束主序列。

于 2017-10-07T10:07:36.163 回答