2017-01-04 56 views
0

在我的片段,我做一個API請求,一切工作正常。我現在正在檢查響應,以查看服務器上可用項目的總數是否大於頁面大小所定義的返回結果集。如果是這樣,我想進行額外的api調用,直到檢索到所有結果並作爲一個響應返回給訂閱者。我需要使用哪個RX操作員來完成此操作,以及如何暫停下面的響應返回,直到後續的api調用完成?RX合併多個觀測

getAction<T>(path: string, params?: {}): Observable<T> { 
 
     return this._http.get("url") 
 
      .map(res => { 
 
       let response = res.json(); 
 
       // If more pages available make additional api calls & return as single result 
 
       return response; 
 
      }); 
 
    }

+1

因爲這是一個線性流,在1個發射完成後''switchMap','flatMap'或'concatMap'應該在你的情況下工作相同 - 當懷疑鏈接多個流時使用'switchMap',在大多數情況下 – olsn

回答

1

看看​​。

要遞歸獲取數據的多個頁面,你可以這樣做:

class MyExample { 
    search(offset) { 
    return this.http.get(`/search?offset=${offset}`); 
    } 

    searchAll() { 
    return this.search(0) 
       .expand(results => { 
       if (loadNextPage(results)) { 
        return this.search(results.nextPageOffset); 
       } else { 
        return Observable.empty(); 
       } 
       }); 
    } 
} 

expand允許您根據之前的結果(如檢查是否有更多頁)做一些處理,並指定Observable有更多的結果。所有這些調用的結果將被連接起來,不需要擔心將它們放在自己身上。

1

你應該使用switchmap,直到你把所有的數據,以獲得從其他觀察到的響應。只是將所有響應連接起來,並將其作爲最後可觀察到的響應返回。例如:

//emit immediately, then every 5s 
const source = Rx.Observable.timer(0, 5000); 

//switch to new inner observable when source emits, emit items that are emitted 
const example = source.switchMap(() => Rx.Observable.interval(500)); 

//output: 0,1,2,3,4,5,6,7,8,9...0,1,2,3,4,5,6,7,8 
const subscribe = example.subscribe(val => console.log(val));