【问题标题】:RxJava2 losing result due to branching logicRxJava2 由于分支逻辑而丢失结果
【发布时间】:2017-08-14 19:40:30
【问题描述】:

我有某种从服务器获得的结果。我正在尝试构建一个可观察的序列,它将: 1.检查结果是否成功(result.success()) 2. 如果是,则从结果中获取一个字符串资源 (result.getResource()) 并返回一个带有该字符串的 observable 3.如果不是,则执行一些故障处理代码并返回一个空的observable

我可以使用简单的 switchMap 轻松实现这一点,但是它包含我不喜欢的副作用(故障处理代码),因为我希望尽可能将不同的操作分开。理想情况下,我想在单独的消费者中进行故障处理,但问题是我无法在不丢失 Result 对象的情况下传递 .success() 方法的结果。有没有办法实现我所需要的?

现在,我的代码如下所示:

Observable<String> getResource() {
            return getServerResult()
            .switchMap(new Function<Result, ObservableSource<String>>() {
                @Override
                public ObservableSource<String> apply(Result result) throws Exception {
                    if (result.success()) {
                        return Observable.just(result.getResource());
                    } else {
                        onFailure(result); // not happy about this side effect being here
                        return Observable.empty();
                    }
                }
            });

【问题讨论】:

    标签: java rx-java rx-java2


    【解决方案1】:

    您可以自定义 Exception 并将结果存储在其中,将其包装成流错误并在 flatMap 中返回,如果结果不成功,请使用 doOnError 调用副作用方法并将其转换回Observable in ErrorResumeNext:

    class MyCustomException extends Exception {
        Result result;
    }
    
    //do you really need switchMap?
    .flatMap(result -> {
        if (result.success()) {
            return Observable.just(result.getResource());
        } else {
            return Observable.error(MyCustomException(result));
        }
    })
    //do* operators is meant to call side effect methods without changing the stream
    .doOnError(exception -> { 
        if(exception instanceof MyCustomException) {
            Result result = ((MyCustomException) exception).getResult();
            onFailure(result);
        }
    })
    .onErrorResumeNext(exception -> {
        if(exception instanceof MyCustomException) {
            return Observable.empty();
        } else {
            return Observable.error(exception); //propagate error downstream
        }
    })
    

    【讨论】:

      猜你喜欢
      • 2019-05-19
      • 2014-08-23
      • 2021-05-08
      • 2022-01-16
      • 2022-11-02
      • 2022-01-12
      • 2014-01-30
      • 2016-04-12
      • 2011-06-12
      相关资源
      最近更新 更多