代码之家  ›  专栏  ›  技术社区  ›  Smajl

如何在RxJava2中错误时终止开关映射序列

  •  0
  • Smajl  · 技术社区  · 7 年前

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

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

    如果我使用 onErrorReturn ,我将把返回的结果传递给下一个开关映射。和 doOnError 当请求失败但整个序列继续时,只执行该步骤。

    fun refreshToken(): Observable<ApplicationRoot> {
            // 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
                    }
    }
    

    如果发生错误,有人知道谁应该跳出开关映射序列吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   hluhovskyi    7 年前

    或许,您应该这样做:

    fun refreshToken(): Observable<ApplicationRoot> {
        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<T> 它应该会起作用。