如何"同步"观测?

时间:2017-02-14 12:55:35

标签: javascript angular typescript 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仍然是一个对象...(包含我的计数值)关于如何将它转换为像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 个答案:

答案 0 :(得分:1)

再一次,解决方案来自Traceback (most recent call last): File "demo.py", line 29, in <module> Map(**{'hello': 'world', 'foo': 'bar'}) # recursive loop File "demo.py", line 13, in __init__ self.__dict__[k] = v File "demo.py", line 17, in __getattribute__ if hasattr(self, 'get_' + attr): File "demo.py", line 17, in __getattribute__ if hasattr(self, 'get_' + attr): [...] RecursionError: maximum recursion depth exceeded 运算符。 : - )

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来生成最终对象)因为我们似乎已覆盖了之前的一个帖子中的所有内容如果有什么不清楚的话,可以随意提问。

Philippe的问题:

  • 为什么要压扁类别数组?我假设Object.assign()发出包含所有类别的SINGLE数组。由于您希望为每个类别运行HTTP请求,因此让观察者单独发出每个类别会更方便。这是第一个getCategories()的作用:它将mergeMap()转换为Observable<Category[]>
  • 为什么要创建一个对象?您说过要将所有内容存储在同一数据结构中。那是Observable<Category>的作用:它为Object.assign对象本身写下每个类别的链接数。这样,您最终会得到一个包含TWO observables信息的对象(类别+ numLinks)。