簡體   English   中英

RxJava:如何包裝多步操作,將完成的步驟返回給觀察者?

[英]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);
}

您可以在這里查看更多示例https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/connectable/HotObservable.java

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM