2017-02-14 12 views
0

私は、コードのこの部分を持っている:Observablesを「同期する」方法は?

ngOnInit(): void 

     { 
this.categories = this.categoryService.getCategories(); 

      var example = this.categories.flatMap((categor) => categor.map((categories) => { 

      var links = this.categoryService.countCategoryLinks(categories.id) 
         .subscribe(valeur => console.log(valeur)); 
       return categories.id 
      })); 
    } 

結果は、2つの観測です。 1つはカテゴリのリストで構成されています。 2番目は、特定のcategories.idの項目数です。

私の質問は以下の通りです:

どのように私は、特定のデータ構造に構造化すべての情報を得ることができますか? 私は、同じデータ構造内のカテゴリごとにカテゴリとアイテムの数を保存して、それらをTSコンポーネントで表示できるようにしたいと考えています。

私は私の問題を修正しようとして段階的に行って、私はほとんど解決され、次のコードを持って行きました:

this.categories = this.categoryService.getCategories(); 
     var example = this.categories.mergeMap((categor) => categor.map((myCateg) => 
      { 
      this.categoryService.countCategoryLinks(myCateg.id) 
       .map(numlinks => Object.assign(myCateg,{numLinks: numlinks})) 
        .subscribe(valeur => console.log(valeur)); 
      return myCateg.id 
     })); 

それは次のように出力できます:

enter image description here

をnumLinksはまだオブジェクトです...(私のカウント値を含んでいます)categoryNameやidのようなjsonプロパティに変換する方法はありますか?事前およびよろしくで

おかげで、ここで

が問題に 解決です:

ngOnInit(): void 
{ 
    this.categories = this.categoryService.getCategories(); 
    const example = this.categories 
     .mergeMap((categor) => categor 
      .map((myCateg) => { 
     this.categoryService.countCategoryLinks(myCateg.id) 
      .map(numlinks => { 
       myCateg.numlinks = numlinks.count; 
       return myCateg; 
      }) 
       //Object.assign(myCateg,{numLinks: numlinks})) 
      .subscribe(value => console.log(value)); 
     return myCateg 
    })); 

      example.subscribe(val => console.log("value2: "+val)); 

} 

答えて

1

もう一度は、溶液はmergeMap()オペレータから来ています。

this.categoryService.getCategories() 
    .mergeMap(val => val) // "Flatten" the categories array 
    .mergeMap(category => 
    this.categoryService.countCategoryLinks(category.id) 
     // Write the number of links on the `category` object 
     .map(numLinks => Object.assign(category, {numLinks: numLinks})) 
) 
    .toArray() 
    .subscribe(allCategoriesWithNumLinks => console.log(allCategoriesWithNumLinks)); 

:-)私たちは私たちが持っていた前のスレッド内のすべてのものをカバーのようにそれはそうので、(最終的なオブジェクトを生成するために、配列、Object.assign()を平坦化する最初のmergeMap)細目に入るが、いませんよ何か不明な点があればお気軽に質問してください。

フィリップさんの質問:

  • なぜカテゴリの配列をフラット化?私はgetCategories()がすべてのカテゴリを含む単一の配列を放出すると仮定しています。それぞれのカテゴリに対してHTTPリクエストを実行したいので、各カテゴリを個別に発信する観測可能な方が便利です。それは最初のmergeMap()のことです:Observable<Category[]>Observable<Category>に変換します。
  • なぜオブジェクトを作成するのですか?あなたは、すべてを同じデータ構造に保存したいと言っていました。これはObject.assignの機能です:categoryオブジェクトの各カテゴリで見つかったリンクの数を書き込みます。このようにして、2つのオブザーバブル(category + numLinks)からの情報を含む1つのオブジェクトになります。
+0

この投稿は、この技術に関する知識が不足していることが主な原因です。しかし、なぜ配列を "平坦化"する必要がありますか? Observablesで作業しているためにオブジェクトを作成する理由と、2つのソースを1つにマージすることが考えられる(これは単なる意見です)。ソースのうち、Observablesは更新可能ではないことを理解しました。 –

+0

私はより詳細な説明で私の答えを更新しました。あなたはエッグヘッドを試してみるべきです。RxJSに関するioチュートリアルは、本当に役に立ちます。 – AngularChef

+0

ありがとう@AngularFrance。私は確かに自分自身をさらに見る必要があります。 –

関連する問題