2017-01-04 13 views
0

私のスニペットでは、私はAPIリクエストを行い、すべて正常に動作します。私は今、サーバー上で利用可能な項目の総数が、pagesizeで定義された返された結果セットよりも大きいかどうかを調べるために、応答を調べたいと考えています。それは私はすべての結果が取得され、1つの応答として加入者に返されるまで、私は追加の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)); 
関連する問題