2016-06-23 11 views
4

私は関数getNews()を持っています。これは基本的にangularのhttp.get要求を返します。リクエストの結果はIdの配列です。私はこの配列を繰り返して、別のhttp.getリクエスト(関数getItem(id))を実行して、サーバーから受信した単一のIDのオブジェクトを返します。RxJS観測可能な戻り配列、各配列の繰り返しで別の関数を実行

私はそうのようにそれを使用して試してみた:明らかに

getLatest() { 
    return this.http.get('all_news_url') 
    .map(res => res.json()) 
    // I even tried creating Observable from array and get only 5 elements 
    //.map(res => Observable.from(res.json())) 
    //.take(5) 
    .map((data) => this.getItem(data)) 
    .subscribe(
     data => { 
     console.log(data); 
     } 
    ) 
    } 

    getItem(itemId: any): Observable<any> { 
    console.log('item id', itemId); 

    return this.http.get(this.generateUrl(`item/${itemId}`)) 
    .map(res => res.json()); 
    } 

、これは動作しません。パラメータgetItem()への関数は常に、Idの配列全体として渡されます。

この質問にご参加いただき、ありがとうございます。

答えて

6

mapの代わりにconcatMap演算子を使用します。 concatMapは返されるObservableをソースObservableにフラット化しますが、mapはObservableのオブザーバブルを返します。あなたは「all_news_url」に記載されている同じ順序であるのgetItem()からのデータを使用する場合は

、あなたは上記のコードで

this.http.get('all_news_url') 
.concatMap(res => Observable.from(res.json()).take(5)) 
.concatMap((data) => this.getItem(data)) 
.subscribe(
    data => { 
    console.log(data); 
    } 
); 

ような何かを試みることができる、のgetItem()への呼び出しは同期されますつまり、一度に 'item/$ {itemId}'へのリクエストは1つだけです。

注文を気にせず、一度に複数のリクエストを送信してスピードアップしたい場合2番目のconcatMapをmergeMapに変更します。依頼(item/itemIdへの依頼)は依然として順序どおりですが、返答の順序についての保証はないことに注意してください。最大並行リクエストは、の3番目のパラメータとしてmergeMap(undefinedまたはnullを渡して2番目のパラメータを無視する)として指定できます。

.concatMap(res => Observable.from(res.json()).take(5)) 
.mergeMap((data) => this.getItem(data), null, 3) 

mergeMapの三番目のパラメータとして1を渡すと、これは私が探していたまさにですconcatMap

+0

に相当します。あなたが投稿したコードの最初の部分に、ちょっとした誤字があります。 '.map(res => res.json())'の必要はありません。どうもありがとうございました。 – gregor

+0

あなたは正しい@greorです。あまり注意を払わずにコピー&ペーストしました;) –

関連する問題