2017-02-28 8 views
1

私はidを渡して、データベースから要素をロードするルートを角度で持っています。 this.service.getElement(id)がHTTP呼び出しを行い、観測を返し角度2のルータパラメータが複数のhttp呼び出しを発行する

this.route.params 
     .map((params: Params) => params['id']) 
     .switchMap((id: number) => this.service.getElement(id)) 
     .catch((e) => { 
      return Observable.throw(e); 
     }) 
     .subscribe((data: Models.IElement) => { 
      this.element= data as Models.IElement; 
      this.setTitle(); 
     },() => this.router.navigate(['/'])); 

:私のコンポーネントでは、私は次のコードを使用して要素をロードします。それはすべてうまくいく。私が今問題としているのは、2番目のhttpコールを発行したいのですが、2番目のサービスのhttpコールのコードをどこに追加するのかわかりません(getElementと同様の方法で、idをパラメータとして受け取ります)。

詳細情報: 2番目のhttpコールは、理想的にはgetElementコールと並行して発行されます。それはParamsidにのみ依存します。

Observablesを使用してこの作業を行うにはどうすればよいですか?それを動作させる方法はありますか?

+0

ここで、2回目の呼び出しを行いますか?それは何に基づいていますか?以前の返答で?ルートparams id?より多くの情報を与えてください – Maxime

+0

それはidに基づいてのみです。理想的には、getElement呼び出しと並列に発行されます。 –

+2

私はあなたに今すぐ解決策を与える時間がありませんが、[Fork Join](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method)を見てください。 -forkJoin)、それは 'Promise.all'と等価です。あなたが渡したObservablesをすべて購読して、続行する前にすべてのObservablesが終了するのを待ちます。もちろん、それらは並行して開始されます。私はあなたに何かを試してみましょう、後で成功しなければ私は助けます:) – Maxime

答えて

1

私は次のコードに付属のマキシムさんのコメント@使用:

this.route.params 
     .map((params: Params) => params['id']) 
     .switchMap((id: number) => { 
      this.id = id; 
      return Observable.forkJoin([this.service.getElem(id), this.service.getElemDocs(id)]); 
     }) 
     .catch((e) => { 
      return Observable.throw(e); 
     }) 
     .subscribe(([elem, documents]) => { 
      this.elem= elemas Models.IElement; 
      this.elemDocuments = documents; 
      this.setTitle(); 
     },() => this.router.navigate(['/'])); 

これは、同時に両方のコールを起動し、両方からcompletitionを待ちます。

関連する問題