2016-07-11 11 views
4

私は角度2を使用しています。これはhttpコンポーネントです。2回目のhttp呼び出しを行い、結果を同じObservableで使用してください

要素のリストを返すREST APIを呼び出す必要があります。そのリストのサイズは100エントリに制限されています。それ以上の項目がある場合は、hasMoreフラグが応答に設定されます。次に、パラメータpage = 2を使用してAPIを再度呼び出す必要があります。 Observableを1つ持ち、両方のサーバーの応答があるといいでしょう。

call({page: 1}) 
    .map(res => res.json()) 
    .do((res) => { 
    if(res.meta.hasMore){ 
     // do another request with page = 2 
    } 
    } 
    .map(...) 
    .subscribe(callback) 

callが要求を行い、観測を返すために、HTTPモジュールを使用する関数です。 私のコードは次のようになります。 ifステートメントの内部で別のhttpリクエストを行い、その結果を同じObservableに入れて、subscribeで登録されたコールバックを2回(各応答に1回)呼び出すようにします。

私は本当にそれを行う方法がわかりません。私はflatMapを使って次のリクエストを試みましたが、成功しませんでした。

答えて

6

再帰が拡大し、オペレータがためですまさにです:

let callAndMap = (pageNo) => call({page: pageNo}).map(res => {page: pageNo, data: res.json()}); // map, and save the page number for recursion later. 

callAndMap(1) 
.expand(obj => (obj.data.meta.hasMore ? callAndMap(obj.page + 1) : Observable.empty())) 
//.map(obj => obj.data) // uncomment this line if you need to map back to original response json 
.subscribe(callback); 
2

あなたはこのためにflatMapオペレータを活用することができます:

call({page: 1}) 
    .map(res => res.json()) 
.flatMap((res) => { 
    if(res.meta.hasMore){ 
    return Observable.forkJoin([ 
     Observable.of(res), 
     call({page: 2}).map(res => res.json() 
    ]); 
    } else { 
    return Observable.of(res); 
    } 
}) 
.map(data => { 
    // if data is an array, it contains both responses of request 
    // data[0] -> data for first page 
    // data[1] -> data for second page 

    // if data is an object, it contains the result of the first page 
}) 
.subscribe(callback); 

最後mapオペレータがsubscribeメソッドで指定したコールバックの両方のケースでデータをフォーマットすることです。

+0

は答えをいただき、ありがとうございます。たった2ページでうまくいきましたが、2回目の呼び出しでhasMoreフラグが再び設定されました。私はこのような再帰呼び出しが必要だと思う:http://pastebin.com/JnDu1uJz また、私はすでにそこにある結果をすぐに表示し、来るように他のものを追加したい。私はstartWithを使用してスキャンしました。あれは正しいですか? – JNK

関連する問題