gpt4 book ai didi

java - RxJava2 由于分支逻辑而丢失结果

转载 作者:行者123 更新时间:2023-11-30 02:36:22 25 4
gpt4 key购买 nike

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

我可以通过一个简单的 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();
}
}
});

最佳答案

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

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
}
})

关于java - RxJava2 由于分支逻辑而丢失结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42955926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com