2017-02-14 116 views
0

我有这样一段代码:如何“同步”Observable?

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 
      })); 
    } 

结果是两个观测。 一个包含在一个类别列表中。 第二个是特定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仍然是一个对象...(包含我的计数值)任何想法如何将其转换为json属性,如categoryName或id?

在此先感谢和问候,

这里是解决的问题:

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)); 

我不打算进入细节(第mergeMap扁平化阵列,Object.assign(),产生最终的对象),因为它看起来像我们涵盖了所有在以前的线程,我们有,但如果有任何不清楚的地方,请随时提问。

菲利普的问题:

  • 为什么拼合类数组?我假设getCategories()发出一个包含所有类别的单数组。既然你想为每个类别运行一个HTTP请求,那么让每个类别都有一个独立的可观察对象会更方便。这就是第一个mergeMap()所做的:它将Observable<Category[]>转换为Observable<Category>
  • 为什么要创建一个对象?你说过你想把所有的东西都存储在同一个数据结构中。这就是Object.assign所做的:它为category对象本身写入每个类别的链接数量。这样,你最终得到一个包含来自两个观测值(类别+ numLinks)的信息的对象。
+0

这篇文章主要是由于我对这项技术缺乏了解,对此感到抱歉。但是,为什么我需要“扁平化”阵列?为什么要创建一个对象,因为我们正在研究Obserbles,并且有两个来源可以“合并”成一个对象(这只是一个意见)。我的理解是观察者不可更新。 –

+0

我已经用更详细的解释更新了我的答案。你应该尝试看看egghead。io教程RxJS,他们真的很有帮助。 – AngularChef

+0

谢谢你@AngularFrance。我需要自己进一步确定。 –