2017-08-30 47 views
1

我的要求是,我有兩個端點一個列出HondaCars和一個列表PeugoetCars當我使用combineLatest運算符時,它不會等待另一個流完成;rxjs發出並行請求並等待兩個完成並更新後,其中一個發出

這裏我的要求=>第一次等待,直到兩個源流兩者的一個後收到的值那麼刷新後接收的值

編輯

所以經過搜索的一段時間,我只是貼有combineLatest但訣竅是在這裏:

this.loading = Observable.combineLatest(
    myFirstObservableIndicatingIfFirstHttpReqEnded, 
    mySecondObservableIndicatingIfSecondHttpReqEnded 
).map(d => d.some(t => t === true)); 

所以現在,用戶只要看到微調,直到所有請求已完成,即使兩者的一個可觀測量一個已經取得了一定的價值。

只是爲了澄清我有兩個loadingReducers這是處理加載邏輯對於每個可測量,所以在我的情況下,我這樣做是爲了知道當兩個HTTP調用完成

+0

完全有觀測一個非常特殊的意義。大理石圖可以讓你的情況更清晰。無論如何,它聽起來像你想要的其實是'combineLatest':「爲了確保輸出數組的長度始終相同,'combineLatest'實際上會等待所有輸入的可觀察對象至少發出一次」 – cartant

+0

你能否用什麼來更新你的問題你已經試過了? –

+0

@ Jota.Toledo好吧,我會更新我的問題與我所做的 –

回答

1

首先,您需要使用Observable.forkJoin(),然後用.switchMap()切換你可觀察到Observable.combineLatest()

let combined = Observable 
    .forkJoin([myFirstObservableIndicatingIfFirstHttpReqEnded, mySecondObservableIndicatingIfSecondHttpReqEnded]) 
    .switchMap(joinedResults => { 
     console.log('forkJoined results!', joinedResults); 
     this.hasReqEnded = joinedResults.some(t => t === true); 
     return Observable.combineLatest(joinedResults) 
    }); 

combined.subscribe(d => this.hasReqEnded = d.some(t => t === true)); 

this.hasReqEnded就是我創造了一些虛擬變量。訣竅是你需要寫兩次this.hasReqEnded的值:一次在switchMap(在forkJoin之後),另一個在訂閱,即在Observable.combineLastest()之後。

或者,您可以有兩個觀察對象:一個是forkJoin,另一個是combineLatest(),您可以訂閱兩個觀察對象並相應地更新您的變量。

這裏有一個working JSBin

0

HTTP調用是有限的流:它發出的價值和完成。 所以,第一部分:「第一次的等待,直到兩個源流收到價值」

const initial$ = Rx.Observable.forkJoin(
    this.httpService1.get(), 
    this.httpService2.get() 
); 

第二部分:「那後刷新後兩者的一個接收值」。

我們需要改變一些無限流(一些用戶操作,例如)以流「HondaCars」或「PeugoetCars」的,它可以通過「.switchMap」來完成:

const stream1$ = someUserAction1$ 
    .switchMap(()=>this.httpService1.get()); 

所以,如果我們希望有< [HondaCars,PeugoetCars]立即經過一番動作發出>流:

Rx.Observable.combineLatest(
    someUserAction1$ 
     .startWith(null) // we need to make initial call, but we have no user action yet, fix it) 
     .switchMap(()=>this.httpService2.get())$, 

    someUserAction2$ 
     .startWith(null) 
     .switchMap(()=>this.httpService2.get())$ 
); 
相關問題