Observable 'wait' 用于访问令牌的另一个 observable 并重新订阅

Observable 'wait' for another observable for access token and resubscribe

我遇到了一个问题,情况是我正在调用 Observable getFilms() 并且当令牌过期并抛出一个 onError 我想向另一个 Observable 请求刷新令牌 'wait' 并且重新订阅此 getFilms() 方法。

我试过 retryWhen 但它被调用了 3 次,这不是我想要的,即使设置了 firstAttempt 条件也没有达到预期的效果

getFilms() .hereWaitForRefreshTokenObservable() .~ .subscribe(films ->)

如果有人来到这里,解决方法是正确使用 Authenticator。

就我而言,我怀疑它的性能并花了几个小时试图在 RXJava 层中修复它。

我只是忘了添加“Bearer”:

 .header("Authorization", "Bearer $newToken")

Observable 'wait' for another observable for access token and resubscribe

标题问题的答案:

getFilms()
    .onErrorResumeNext { ex ->
        if(ex is HttpException && ex.code() == 401){
            reauthorize()
                .flatMap { 
                    getFilms() 
                }
        } else {
            Observable.error(ex)
        }
    }

这是使用过期访问(如 JWT)时非常常见的模式。

旁注:我假设我们正在谈论 http 调用,在这种情况下,您可能应该使用 Maybe(最终 SingleCompletable)而不是 Observable. Observable 用于 return 超过 1 个元素的序列,http 调用通常不能 return 超过 1 个响应。除非你有一些普通客户端所缺乏的非常高级的缓存。