2017-07-31 9 views
3

私はAngular 4アプリを製作しています。コンポーネントがObservableを購読しています。ときにはObservableが同じURLを呼び出します。たとえば、http要求の前に必要に応じて「アクセストークンを更新する」などです。しかし、別の3つのHTTPリクエストを作成すると、リフレッシュトークンの3倍の「必要に応じてリフレッシュ」します。RxJで複数の同じhttpリクエストを処理/キューに入れる方法は?

どのようにして、1つのhttpでリフレッシュされたアクセストークンを取得し、最初のものについて他の観測値を待機させるのですか? (私は '待つ'はオブザーバブルのための良い言葉ではないことを知っている)。

 public get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
      return this.getAccessToken().mergeMap(accessToken => { 
       return this.http.get(url, options); 
      }); 
      } 

//そして

this.get('www.myapi.com/one').subscribe(data=>console.log('one',data)) 
this.get('www.myapi.com/two').subscribe(data=>console.log('two',data)) 
this.get('www.myapi.com/three').subscribe(data=>console.log('three,data)) 
+0

なぜ私はどちらが呼び出されるか分からないので、最初のもののサブスクライブ内の他の観測値を呼び出さないでください。 –

+0

そしてそれはあまりrxjs-lyではありません。 – Stefdelec

答えて

3

あなたが観察ソースへの唯一の1つのサブスクリプションが常に存在だと確信しますshare()演算子を使用することができますように思えます。

const sharedToken = this.getAccessToken().share(); 

public get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
    return sharedToken.mergeMap(accessToken => { 
    return this.http.get(url, options); 
    }); 
} 
+0

ありがとうございます。そして、 '' this.getAccessToken'''にパラメータを渡したいと思ったら? – Stefdelec

0

使用オペレータがforkJoinと呼ば:すべてのオブザーバーはshare()の同じインスタンスを使用する必要があるため

は、しかし、これはあなたのコードを再構築するためにあなたを必要とします。 Promiseに慣れている場合、これはPromise.all()と非常によく似ています。 forkJoin()演算子はObservableのリストを取得して並列に実行することを可能にします。一度、リスト内のすべての観察可能にした値forkJoinを発するリスト

での観測から、すべて解決された値のリストを含む単一の観察可能な値は以下の例を経由してください発する:

インポート:

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/forkJoin'; 

あなたは3つのページ

var pages:number[] = [1, 2, 3]; 

またはを取得する必要がありますと仮定しましょう

、その後、観測の配列にそれらをマッピングし、forkJoin

Observable.forkJoin(
    pages.map(
     i => this.http.get('www.myapi.com/' + i) 
     .map(res => res.json()) 
    ) 
).subscribe(people => this.people = people); 

詳細はStackまたはforkJoinを行ってください。

関連する問題