[英]RxJava: How can I wrap a multi-step operation, returning the step complete to observers?
可以说我有一个登录和用户数据方法,代表HTTP调用:
Single<LoginResponse> login();
Single<UserData> userData();
我需要先调用login()
然后再调用userData()
。 如果两个都成功,则用户已登录。
我知道如何将它们包装在例如Completable
:
Completable performLogin() {
login().doOnSuccess(this::storeLoginResponse)
.flatMap(userData())
.doOnSuccess(this::storeUserData)
.doOnError(this::wipeLoginData)
.toCompletable();
}
所以用户界面然后说
showLoading();
performLogin().subscribe(() -> {
stopLoading();
onLoginSuccess();
}, error -> {
stopLoading();
onLoginFailure();
});
如果UI需要显示正在加载的哪个阶段怎么办? 如上,当login()
调用完成并且userData()
调用开始时,它将更改UI?
我想到的是这样的
Observable<LoginStage> performLogin() {
return Observable.create(emitter -> {
login.doOnSuccess(response -> {
storeLoginResponse(response)
emitter.onNext(LOGIN_COMPLETE)
}).flatMap(userData())
.subscribe(userData -> {
storeUserData(userData);
emitter.onNext(USER_DATA_COMPLETE)
emitter.onComplete();
}, error -> {
wipeLoginData();
emitter.onError(error);
});
});
}
但是感觉上有更好的或更多的接收方法。
您可以使用热的可观测值,并将一个可观测值链接到另一个主题,并在需要时将所有项从一个发射传递给另一个。
@Test
public void chainObservablesWithSubject() throws InterruptedException {
Observable<Long> observable = Observable.from(Arrays.asList(1l, 2l, 3l, 4l));
Subject<Long, Long> chainObservable = ReplaySubject.create(1);
observable.subscribe(chainObservable);
chainObservable.subscribe(System.out::println, (e) -> System.err.println(e.getMessage()), System.out::println);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.