2016-07-07 11 views
1

オブジェクトの作成が終了した後でも、観察可能なサブスクリプションのチェーンの結果として機能する関数を実行する必要があります。あなたが見ることができるように、私はすべてが言われる続いた後...等、これらの結果からそれぞれ別の、getCampsから返された各項目のサブスクリプションを作成する必要があり、かつ観測可能な一連のサブスクリプションが完了した後に関数を実行する(角2)

getFilters() { 
     this.filterSvc.getCamps() 
      .subscribe(
       c => { 
        this.filters = c; 
        for (let camp of this.filters) { 
         this.filterSvc.getBuildings(camp.id) 
          .subscribe(
           b => { 
            camp.buildings = b; 
            for (let building of camp.buildings) { 
             this.filterSvc.getFloors(building.id) 
              .subscribe(f => { 
               building.floors = f 
              }); 
            }; 
           }); 
        } 
       }); 
      // ONLY DO THIS AFTER THE OBJECT IS HYDRATED 
      this.globals.setCampFilters(this.filters); 
    } 

:ここ

は、私のチェーンです完了で、私はすべての私のキャンプは、建物を持っていると私は私のフィルタを移入行く前にすべてのそれらの建物は床を持ってまで、どのように私は待つことができますか?

setCampFilters(this.filters); 

を実行したいですか

答えて

1

Object.forJoinと一緒にflatMap演算子を使用します。ここにサンプルがあります:

getFilters() { 
    this.filterSvc.getCamps() 
     .flatMap(c => { 
      this.filters = c; 
      // Observables for all camps 
      return Observable.forkJoin(this.filters.map(camp => { 
      // Links camp with the result of getBuildings 
      return Observable.forkJoin([ 
       Observable.of(camp), 
       this.filterSvc.getBuildings(camp.id) 
      ]); 
      }) 
     }) 
     .map(results => { 
      // Map results and link buildings with camps 
      return results.map(result => { 
      let camp = result[0]; 
      let buildings = result[1]; 
      camp.buildings = buildings; 
      return camp; 
      }); 
     }) 
     .subscribe(camps => { 
      // ... 
     ]); 

flatMapにチェーンできることに注意してください。

この記事では、あなたの興味ができます

+0

ここに何かがあるようですが、実行された実行は内部コードの多くに達しません。私が迷惑をかけたり、ブレークポイントを設定したりしても、そのほとんどがヒットせず、エラーもなくなり、最終的に私のフィルターは決して占有されません。正当な敬意を払って、ブログ記事のクリックスルーを行っているのか、それとも実際に問題を考えているのか疑問に思います。 – Methodician

1
window.getFilters = function() { 
    this.filterSvc.getCamps() 
    .do((c: any) => this.filters = c) 
    .flatMap((c: any) => Observable.from(c)) // convert from Observable<Array<Camp>> to Observable<Camp> 
    .flatMap((camp: any) => this.filterSvc.getBuildings(camp.id).do(b => camp.buildings = b)) 
    .flatMap(b => Observable.from(b)) 
    .flatMap((building: any) => this.filterSvc.getFloors(building.id).do(f => building.floors = f)) 
    .subscribe(null, null,() => this.globals.setCampFilters(this.filters)); 
} 

flatMapのシリーズが観測<アレイ<フロアに観察可能<アレイ<キャンプ>>から観測を回す>>、あなたはそれのonCompleteイベントでthis.globals.setCampFiltersに電話する必要があります。

EDIT:Typescriptコンパイラが互換性のない型について不平を言わないようにコードを更新しました。私は: anyを追加します。私はTSコンパイラが文句を言うと思いますが、あなたはすべての前に自由に追加します。=>

+0

あなたの答えは有望そうですが、私は "''} ''型に存在しないプロパティID ''と類似したエラーのスルーを取得し、 ''プロパティ '建物' '{}'型に存在しないと私はハックすることはできませんあなたがTSを使用しているなら、 'c =>'、 'camp =>'を置き換えることができることをTSに知らせる良い方法です。 "MenuCamp"タイプの建物で、 "MenuBuilding"などのタイプの建物です。 – Methodician

+0

..(c:any)=> '、'(キャンプ:any)=> '。あなたが望むなら、コードが正常にコンパイルされたあと、対応する型で 'any'を置き換えようとすることができます。(しかし私はそれは必要ではないと思っています) –

+0

そして次回は'#typescript'タグの追加を検討してください。 TSまたはES6/7を使用している場合、コードから伝えるのは難しい –

関連する問題