2017-04-18 4 views
0

Angular2アプリから3つのWebサービスを呼び出す必要があり、それらをチェーンする必要があります。両方とも一緒に呼び出すことができるので、私はforkJoinを使います。しかし、後で、サービスの1つから返されたIDを使用して別のサービスを呼び出す必要があります。 最後のサービスをforkJoinの結果と連鎖させる適切な方法はどれですか?RxJs5 in Angular:データを変換しないObservableを連鎖させる適切な方法はどれですか?

私はflatMapを使用できますが、この最後のサービスはforkJoinから得られたものを変換しません(mapとflatMapは変換演算子と呼ばれます)。返されたデータを何かに変換するときにのみ使用してくださいelse)。

私はforkJoinを購読し、成功した場合は最後のサービスに再度購読する(私はそれが気に入らない)?または、Zip(またはZipAll)演算子を使用する必要がありますか? ありがとうございます。

編集:私は例を挙げます。

  1. getProject(projectId): レッツは、私はいくつかのプロジェクト情報を取得する必要があり、私は3つのサービスを持っていると言い、そのタイトルのようなプロジェクトに関する情報、期間、...そして、いくつかのプロパティを持つprojectPropertiesIdプロジェクトを取得します持てる。

  2. getProperties():プロジェクトが持つことができるすべてのプロパティのリストを取得します。

  3. getProjectProperties(propertiesId):選択したプロパティのリストを取得します。 一つの解決策が考えられます。あなたはforkJoinを持った後

this.subscriber1 = Observable.forkJoin(this.projectService.getProject(projectId), this.projectService.getProperties()) 
.subscribe(data => { 
    this.project = data[0]; 
    this.properties = data[1]; 
    this.subscriber2 = 
    this.projectService.getProperties(this.project.propertiesId) 
    .subscribe(selectedProperties => { 
     // save the selected properties... 
    } 
}); 

は、より良いすべきではない、別の内の加入者を持っている代わりに、チェーンに最後のサービスコール(projectService.getPropertiesを)ジップ演算子を使用します加入者?

+1

残念ながら、現在のところ、スタックオーバーフローへようこそ、答えは:それは依存しています。多分、あなたがしたことを私たちに示すコードを追加することができます。あなたが達成しようとしていることを理解することがより簡単になります。 – n00dl3

+0

_ "3つのWebサービスを呼び出す必要があります" _ _ _ "両方とも" 3か2か? _私はそれらを連鎖する必要があります_ _ _ "私はforkJoinを使用しています" _チェーンやフォーク?例が役に立つでしょう。 – zeroflagL

+0

私は例を使って質問を編集しました... –

答えて

0

subscriptionsをネストするのは一般的に推奨されていません。すべてをsingle streamに保存する必要があります。私はあなたの例を完全には得ていませんが、あなたが求めているのは、2つのサービスを並行して呼び出すことです。両方が戻ったら、2つの最初のサービス呼び出しの値を使って3番目のサービスを呼び出します。

初期サービスの両方の観測値が完全であると仮定すると、このようにすることができます。 forkJoinが完了するのを待ちます。

this.subscription = Observable 
    .forkJoin([this.projectService.getProject(projectId), this.projectService.getProperties()]) 
    .switchMap(([project, properties]) => this.projectService.getProjectProperties(project.somevalue, properties.somevalue)) 
    .subscribe(data => { 
     // save the selected properties... 
    }); 
+0

あなたの答えをありがとう。なぜあなたは 'zip'ではなく' switchMap'を選んだのですか? –

+0

2つの最初の呼び出しの結果をストリームに組み込む必要はありませんでした.3番目の呼び出しを呼び出すためのパラメータとしてのみ必要です。 – Thibs

関連する問題