如何在RxJava2中错误地终止开关图的序列

我正试图在RxJava2和Kotlin中实现一个刷新令牌流,并且在处理错误时遇到了问题。 有几个请求需要按顺序完成,但是如果有一些错误,顺序会有所不同。

基本上,如果我尝试使用我的刷新令牌并接收400 - Bad Request响应,因为令牌无效,我需要终止流并且不执行下一个switchMap (理想情况下,我想返回最终的Observable )。 但我不知道如何做到这一点。

如果我使用onErrorReturn ,我只是将返回的结果传递给下一个切换映射。 而doOnError只是在请求失败的时候执行这个步骤,但是整个序列还在继续。

 fun refreshToken(): Observable { // try to use the refresh token to obtain an access token return authRepository.refreshToken(token) .switchMap { response -> // process response here userRepository.getUser() // fetch user details }.doOnError { // TODO - return final result, do not jump to next switchMap // refresh token is not valid -> go to login screen Observable.just(ApplicationRoot.LOGIN) // not working }.switchMap { response -> // excpects response of type UserResponse // save user details here } } 

有没有人知道如果发生错误,谁跳出了开关图的序列?

也许你应该这样做:

 fun refreshToken(): Observable { return authRepository.refreshToken(token) .switchMap { response -> userRepository.getUser() } .switchMap { response -> // do something with user response } .map { ApplicationRoot.ROOT_THAT_MEANS_SUCCESS } .onErrorResumeNext(Observable.just(ApplicationRoot.LOGIN)) } 

我不知道authRepository.refreshToken实现以及responses如何,但如果response是您的自定义对象,而不是retrofit2.Response它应该工作。