2017-09-28 5 views
0

gitlab Apiの最初の呼び出しを実行し、すべてのスター付きプロジェクトを返します。完了したら、カスタムプロジェクトオブジェクトに追加してどこかに保存するために、各プロジェクトに関連付けられたすべてのマイルストーンを取得したいと思います。rxjs angular - foreachとの結果をマージしてobserableのリターンを分割します

forEach httpコールを実行し、すべての呼び出しが完了して結果を1つにマージするのを許可するrxjs演算子がありますか?

getStarredProjects$(): Observable<GitlabProject[]> { 
    return this.http.get(this.starredProjectsUrl).map((res: GitlabProject[]) => { 
     res.forEach((project:GitlabProject)=>{ 
      this.getMileStones(project.id).subscribe() 
     }) 
     return res 
    }) 
} 

getMileStones(projectId:number){ 
    return this.http.get(`${this.projectUrl}/${projectId}/milestones`) 
} 

答えて

1

サブスクライブしたいオブザーバブルの配列を作成して、同時に実行することができます。 forkJoin()は、すべてのオブザーバブルが完了したときに発生します。 forkJoin上

getStarredProjects$(): Observable<ProjectMilestones[]> { 
    return this.http.get(this.starredProjectsUrl) 
     .flatMap((res: GitlabProject[]) => { 
      // build out array of observables 
      let observables$ = res.map(project => { 
       return this.getMileStones(project.id); 
      }); 
      // return array of observables to run simultaneously 
      // spread operator here is optional, forkJoin() would also accept an array of observables 
      return Observable.forkJoin(...observables$); 
     }) 
} 

getMileStones(projectId:number){ 
    return this.http.get(`${this.projectUrl}/${projectId}/milestones`) 
} 

this.getStarredProjects$.subscriber(res => { 
    // res is an array of the results. (ie. res[0] is the result of the first observable in the observables$ array, res[1]...res[x]) 
}); 

ドキュメント - https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md

私はまた、チェーンに、ここで最初のAPI呼び出しと、後続のAPIコールをflatMap使用しています。


編集 - cartantが指摘したように、forkJoinいずれか観測のアレイまたは各パラメータの観察をexceptsで。この場合、スプレッド演算子を使用すると、オブザーバブルの配列を渡すことができない他のコンビネーション演算子(コンカットなど)と一致することが有益です。

+1

'forkJoin'は[observablesの配列](https://github.com/ReactiveX/rxjs/blob/5.4.3/src/observable/ForkJoinObservable.ts#L34-L37)という単一のパラメータを受け入れます。しかし、あなたと同じように、私は普及している構文を使用することをお勧めします。例えば。 'ObservableInput'として扱われるため、observableの配列を' concat'に渡すことはできません。 – cartant

+0

@cartant良い点です。私はそれを反映するために私の答えを更新しました。 – LLai

関連する問題