2016-12-17 12 views
0

が、私は結果の成功した通知のためのいくつかのHTTPリクエストと利用rxjsをしています要求します配列では、いくつかの値を読んで、それぞれのレポートでそれらの値を使って新しいhttpリクエストを作り直します。rxjs HTTPやっ

私は2(メンバー/レポート)+ apprを持っています。 4から8(他のもの)要求。

6〜8回のリクエストが実行されました。成功したハンドラで前の6〜8回のリクエストからすべてのデータを取得します。

rxjsでどうすればいいですか?

UPDATE

詳細について尋ねたOLSNユーザーとして

と彼の懸念私はここ6〜8の要求がどのように見えるべきか(擬似コード)より多くのデータを入れていただきました!私は今、彼を理解して:

getReportings(departmentId: number): Observable<any> { 
    return Observable.forkJoin(
     this.http.get('/api/members/' + departmentId).map(res => res.json()), 
     this.http.get('/api/reports/' + departmentId).map(res => res.json()) 
    ).switchMap((result: [any[], any[]]) => { 
     let members: any[] = result[0]; 
     let reports: any[] = result[1]; 
     let allNewStreams: Observable<any>[] = [ 
      Observable.of(members), 
      Observable.of(reports) 
     ]; 

     for(let report of reports) 
     { 
      allNewStreams.push(
this.http.get(report.url + ?key1=report.name1?).map(res => res.json())); 
     } 


     return Observable.forkJoin(allNewStreams); // will contain members, reports + 4-6 other results in an array [members[], reports[], ...other stuff] 
    }); 
} 
をあなたはこのように、 switchMapを使用してストリームを拡張することができ

答えて

2

:これはそれを行う必要があります

getReportings(departmentId: number): Observable<any> { 
    return Observable.forkJoin(
     this.http.get('/api/members/' + departmentId).map(res => res.json()), 
     this.http.get('/api/reports/' + departmentId).map(res => res.json()) 
    ).switchMap((result: [any[], any[]]) => { 
     let members: any[] = result[0]; 
     let reports: any[] = result[1]; 
     let allNewStreams: Observable<any>[] = [ 
      Observable.of(members), 
      Observable.of(reports) 
     ]; 
     // do your stuff and push new streams to array... 
     if (foo) { // for each additional request 
      let reportId: string | number = reports[0].id; // or however you retrieve the reportId 
      allNewStreams.push(
       this.http.get('some/api/ + bar) 
        .map(res => res.json()) 
        .map(data => ({reportId, data})); // so your final object will look like this: {reportId: "d38f68989af87d987f8", data: {...}} 
      ); 
     } 

     return Observable.forkJoin(allNewStreams); // will contain members, reports + 4-6 other results in an array [members[], reports[], ...other stuff] 
    }); 
} 

、それはMOです「古いスタイルの論理ハンマー」アプローチのように - 探している場合は:他の演算子を使ってこれを解決するよりエレガントな方法があるかもしれませんが、それは完全なデータを知らなくては言い難いすべてのロジック。

+0

ありがとうございます!変数の意味は実際にはより良い技術的解決策を可能にしますか? httpリクエストに関するロジックはもうありません。ロジックは、単一のクライアント側のサービスコールが、自分が購読しているすべてのhttpリクエストのデータを取得すると開始します。どのような "完全なデータ"が欠けていますか? – Elisabeth

+0

質問は次のとおりです。他の4-6件のリクエストがどのように決定されましたか、私の理解はどのようにメンバーのレポートデータに依存していても呼び出されない可能性があります。 .itは、レポート内のいくつかのフラグに基づいている可能性があります...または... or..ect ...使用可能な異なるrxjs演算子があるかどうかに依存します - いずれの場合でもif/else -wayは動作しませんより少ない。 – olsn

+0

コードをテストしただけで動作します。しかし、物事が進むにつれ、私はまだ問題があることを実感します。すべての4-8リクエストは、レスポンスにランダムな順序で到着する可能性があります。私はrxjsの著者の脳に残したくありません;-)私の擬似コードに関して、HTTP要求が完了した後にreport_Idを使って4-8リクエストのそれぞれを渡すことは可能ですか?私は各レポートに返信データの関連付けをしたいと思います。レポートの各レポートにIDがあり、各report.urlリクエストのデータ配列を返す代わりに、report_Idと返されたデータを持つオブジェクトを返します:-) – Elisabeth