[英]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.