链接独立的 Observable
Chaining Independent Observables
我喜欢做类似的事情:http://joluet.github.io/blog/2014/07/07/rxjava-retrofit/
我有 3 个休息电话。第一个馈入第二个。但是,没有任何内容进入第 3 次通话。我只需要确保它在第二个之后运行。所以我在这里寻找类似 "chain" 方法的东西:
result1Observable.subscribe(new Observer<result1>() {
@Override public void onNext(result1 firstRestCallResult) {
restCall2(firstRestCallResult).chain(restCall3);
}
}
因为您的 restCall3
可能不会 return 任何东西,所以通常的 map
、flatMap
等运算符可能有点棘手 -类型不会排队。
有点难看,但可能会使用 mergeWith
运算符。您的 restCall3
只会调用 onCompleted()
,不会发出任何值。将事物保持在 Observable
链中应确保如果任何操作出错或未能完成整个链将出错或无法完成(包括 restCall3
)。
public Observable<UserStatus> execChain() {
return login()
.flatMap(responseBody -> getUserStatus(responseBody)
.mergeWith(restCall3()));
}
public Observable<ResponseBody> login() {
...
}
public Observable<UserStatus> getUserStatus(ResponseBody responseBody) {
...
}
public <T> Observable<T> restCall3() {
return Observable.create(new Observable.OnSubscribe<T>() {
@Override
public void call(Subscriber<? super T> subscriber) {
//execute blocking call
performRestCall();
subscriber.onCompleted();
}
});
}
[注:上面的代码我没实际试过]
我假设 restCall3
成功完成对您很重要。如果你不是特别在意,你可能 flatMap
前两个 Observables
并使用 doOnCompleted
并且 Rx 应该确保它 only 被调用如果前面的两个 Observables
都成功完成。
我喜欢做类似的事情:http://joluet.github.io/blog/2014/07/07/rxjava-retrofit/
我有 3 个休息电话。第一个馈入第二个。但是,没有任何内容进入第 3 次通话。我只需要确保它在第二个之后运行。所以我在这里寻找类似 "chain" 方法的东西:
result1Observable.subscribe(new Observer<result1>() {
@Override public void onNext(result1 firstRestCallResult) {
restCall2(firstRestCallResult).chain(restCall3);
}
}
因为您的 restCall3
可能不会 return 任何东西,所以通常的 map
、flatMap
等运算符可能有点棘手 -类型不会排队。
有点难看,但可能会使用 mergeWith
运算符。您的 restCall3
只会调用 onCompleted()
,不会发出任何值。将事物保持在 Observable
链中应确保如果任何操作出错或未能完成整个链将出错或无法完成(包括 restCall3
)。
public Observable<UserStatus> execChain() {
return login()
.flatMap(responseBody -> getUserStatus(responseBody)
.mergeWith(restCall3()));
}
public Observable<ResponseBody> login() {
...
}
public Observable<UserStatus> getUserStatus(ResponseBody responseBody) {
...
}
public <T> Observable<T> restCall3() {
return Observable.create(new Observable.OnSubscribe<T>() {
@Override
public void call(Subscriber<? super T> subscriber) {
//execute blocking call
performRestCall();
subscriber.onCompleted();
}
});
}
[注:上面的代码我没实际试过]
我假设 restCall3
成功完成对您很重要。如果你不是特别在意,你可能 flatMap
前两个 Observables
并使用 doOnCompleted
并且 Rx 应该确保它 only 被调用如果前面的两个 Observables
都成功完成。