仅当前面的可观察对象成功时才调用服务
Call service only if preceding observable succeeded
背景
我只是在研究 java 的 RX 概念。坦率地说,我不明白。在我的项目中,我使用改造库来调用服务。目前,我已经使用回调实现了所有服务。如果我想编排服务调用,我必须在回调中调用回调,这会导致相当混乱的代码。
问题
对于以下两个服务,我想调用服务 B,当且仅当服务 A 使用 Observables 方法成功完成。
public interface RetrofitRestService {
@GET("...")
Observable<Object> A();
@GET("...")
Observable<Object> B();
}
我正在搜索 Observable operators 我可以用于我的任务,但没有任何运气。我可以想象这样的运算符:
RetrofitRestServices service;
service.A().ifSuccessfull(B());
//OR
service.A().ifWasNotEmpty(B());
//OR
service.A().useCondition(new Condition(){ ... }, B());
这个怎么样:
service.A().isEmpty().filter(new Func1<Boolean, Boolean>() {
@Override
public Boolean call(Boolean empty) {
return !empty;
}
})
.flatMap(new Func1<Boolean, Observable<? extends Object>>() {
@Override
public Observable<? extends Integer> call(Boolean empty) {
return B();
}
});
isEmpty
运算符将发出一个布尔值,只有当 A() 不发出任何东西时该值才为真。这就是为什么如果 A() 发出一个项目,过滤器检查 isEmpty
的结果是否会通过并调用 flatMap
,从而调用 B()。
如果要先调用A,再调用B,可以使用运算符concat
:A完成后调用B。
service.A().concatWith(service.B()).subscribe();
但是如果Areturnnull
,B会被调用
如果是这样,那么这个答案会更好:
评论后编辑
如果您想使用 A()
的结果,那么 flatMap
运算符就是您所需要的
service.A().flatMap(resultOfA -> service.B(resultOfA)).subscribe();
(将 resultOfA
作为 B()
的参数只是一个使用示例)
另一种方式:
您也可以根据 A 的响应和 B 的响应构建结果
service.A().flatMap(resultOfA -> service.B().zipWith(Observable.just(resultOfA), (a, b) -> new ResultOf(a, b))).subscribe();
zip
operator 将使用 A 和 B 的结果构建一个结果,在这种情况下。 ResultOf
只是一个示例 class 来展示如何使用 A 和 B 的结果构建结果。
有关 flapMap
的更多信息:When do you use map vs flatMap in RxJava?
背景
我只是在研究 java 的 RX 概念。坦率地说,我不明白。在我的项目中,我使用改造库来调用服务。目前,我已经使用回调实现了所有服务。如果我想编排服务调用,我必须在回调中调用回调,这会导致相当混乱的代码。
问题
对于以下两个服务,我想调用服务 B,当且仅当服务 A 使用 Observables 方法成功完成。
public interface RetrofitRestService {
@GET("...")
Observable<Object> A();
@GET("...")
Observable<Object> B();
}
我正在搜索 Observable operators 我可以用于我的任务,但没有任何运气。我可以想象这样的运算符:
RetrofitRestServices service;
service.A().ifSuccessfull(B());
//OR
service.A().ifWasNotEmpty(B());
//OR
service.A().useCondition(new Condition(){ ... }, B());
这个怎么样:
service.A().isEmpty().filter(new Func1<Boolean, Boolean>() {
@Override
public Boolean call(Boolean empty) {
return !empty;
}
})
.flatMap(new Func1<Boolean, Observable<? extends Object>>() {
@Override
public Observable<? extends Integer> call(Boolean empty) {
return B();
}
});
isEmpty
运算符将发出一个布尔值,只有当 A() 不发出任何东西时该值才为真。这就是为什么如果 A() 发出一个项目,过滤器检查 isEmpty
的结果是否会通过并调用 flatMap
,从而调用 B()。
如果要先调用A,再调用B,可以使用运算符concat
:A完成后调用B。
service.A().concatWith(service.B()).subscribe();
但是如果Areturnnull
,B会被调用
如果是这样,那么这个答案会更好:
评论后编辑
如果您想使用 A()
的结果,那么 flatMap
运算符就是您所需要的
service.A().flatMap(resultOfA -> service.B(resultOfA)).subscribe();
(将 resultOfA
作为 B()
的参数只是一个使用示例)
另一种方式:
您也可以根据 A 的响应和 B 的响应构建结果
service.A().flatMap(resultOfA -> service.B().zipWith(Observable.just(resultOfA), (a, b) -> new ResultOf(a, b))).subscribe();
zip
operator 将使用 A 和 B 的结果构建一个结果,在这种情况下。 ResultOf
只是一个示例 class 来展示如何使用 A 和 B 的结果构建结果。
有关 flapMap
的更多信息:When do you use map vs flatMap in RxJava?