首页 文章

RXJava忽略错误并继续链

提问于
浏览
0

我有一个RXJava链,可以抛出错误 . 我希望链继续并忽略错误并达到订阅,仅针对某些特定错误 .

例如,在此代码中

authDataManager
                    .getUserAccessToken(username, password)
                    .subscribeOn(Schedulers.io())
                    .doOnNext({
                        authDataManager.saveUserAccessToken(it)
                    })
                    .flatMap {
                        appDataManager.getStations()
                    }
                    .doOnNext({
                        appDataManager.persistStations(it)
                    })
                    .flatMap {
                        appDataManager.getDriverInformation()
                    }
                    .doOnNext({
                        appDataManager.persistDriverInformation(it)
                    })
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(
                            {
                                onLoginSuccess()
                            },
                            {
                                onLoginFailure(it)
                            }
                    )

如果 appDataManager.getStations() 抛出错误,我仍然想继续并达到 onLoginSuccess() 方法 .

但是,如果 getUserAccessToken(username, password) 失败,则应调用 onLoginFailure .

我试图在平面图之后和内部添加onErrorResumeNext()和onExceptionResumeNext(),但如果我这样做,链就会退出并且不会继续并到达订阅

3 回答

  • 0

    我在Kotlin认识了这一点here (stackoverflow link)

    它可以通过使用映射,过滤,可选项和 onErrorResumeNext 的组合来完成 . 我认为这与当前版本的RxJava一样优雅 .

    authDataManager
        .getUserAccessToken(username, password)
        .subscribeOn(Schedulers.io())
        .doOnNext({
            authDataManager.saveUserAccessToken(it)
        })
        .flatMap {
            appDataManager.getStations()
                .map(stations -> Single.just(Optional.of(stations))
                .onErrorResumeNext(error -> Single.just(Optional.empty()))                    
         }
         .filter(optional -> optional.isPresent())
         .map(stations -> optional.get())
         .doOnNext({
             appDataManager.persistStations(it)
         })
         .flatMap {
             appDataManager.getDriverInformation()
         }
         .doOnNext({
             appDataManager.persistDriverInformation(it)
         })
         .observeOn(AndroidSchedulers.mainThread())
         .subscribe(
             {
                 onLoginSuccess()
             },
             {
                 onLoginFailure(it)
             }
         )
    
  • 1

    站在@ savepopulation的答案的肩膀上,并使用观察,你有三个不同的观察链:

    authDataManager
                    .getUserAccessToken(username, password)
                    .subscribeOn(Schedulers.io())
                    .doOnNext({
                        authDataManager.saveUserAccessToken(it)
                    })
                    .doOnNext(
                        appDataManager.getStations()
                             .onErrorResumeNext(Observable.empty())
                             .subscribe( appDataManager.persistStations(it) )
                    )
                    .doOnNext( appDataManager.getDriverInformation()
                                 .subscribe( appDataManager.persistDriverInformation(it)
                    )
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(
                            {
                                onLoginSuccess()
                            },
                            {
                                onLoginFailure(it)
                            }
                    )
    

    主观察链流向完成,而两个子链完全不参与日志;它们只是通过获取用户访问令牌来触发 .

    如果您需要这些辅助分支以异步方式运行到主链,则必须添加 subscribeOn() / observeOn() 运算符 .

  • 0

    我想你可以使用 onErrorResumeNext 运算符 .

    authDataManager
                        .getUserAccessToken(username, password)
                        .subscribeOn(Schedulers.io())
                        .doOnNext({
                            authDataManager.saveUserAccessToken(it)
                        })
                        .flatMap {
                            appDataManager.getStations()
                                 .onErrorResumeNext(Observable.empty())
                        }
                        .doOnNext({
                            appDataManager.persistStations(it)
                        })
                        .flatMap {
                            appDataManager.getDriverInformation()
                        }
                        .doOnNext({
                            appDataManager.persistDriverInformation(it)
                        })
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(
                                {
                                    onLoginSuccess()
                                },
                                {
                                    onLoginFailure(it)
                                }
                        )
    

相关问题