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
(最终 Single
或 Completable
)而不是 Observable
. Observable
用于 return 超过 1 个元素的序列,http 调用通常不能 return 超过 1 个响应。除非你有一些普通客户端所缺乏的非常高级的缓存。
我遇到了一个问题,情况是我正在调用 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
(最终 Single
或 Completable
)而不是 Observable
. Observable
用于 return 超过 1 个元素的序列,http 调用通常不能 return 超过 1 个响应。除非你有一些普通客户端所缺乏的非常高级的缓存。