2017-02-09 182 views
0

我有以下代码:如何避免与Observable无限循环?

ngOnInit(): void 
    { 
    const source = this.categoryService.getCategories(); 
    console.log(source instanceof Observable); 
    const example = source.map((categor) => categor.map((categories) => { 
    const links = this.categoryService.countCategoryLinks(categories.id); 
    const aff = example.merge(links).subscribe(linke => console.log(linke)); 
      return categories.id 
     })); 
    } 

其中getCategories()返回一个可观察到的。

在此可观察到的每一个项目,我得到categories.id场运行名为countCategoryLinks另一种方法(categories.id)也返回可观察到的()。

我的问题是:我只有3个类别(ok),countCategoryLinks()返回3个项目(ok),但上面的代码在控制台中显示了一个无限循环。 为了测试目的,“手动”启动的这两种方法都不显示任何循环。

这个问题真的来自上面的代码。

有什么想法?

预先感谢和问候

回答

1

example.merge(links) < =您使用通过在地图回调这将导致递归(即环回本身)的map回调创建可观察到的。这是使用适当的缩进值得付出的代价,因为它更容易看到。

ngOnInit(): void { 
    const source = this.categoryService.getCategories(); 
    console.log(source instanceof Observable); 
    const example = source.map((categor) => categor.map((categories) => { 
     const links = this.categoryService.countCategoryLinks(categories.id); 

     // this line is the issue. You are using variable example which is being created by the callback this line of code is in 
     const aff = example.merge(links).subscribe(linke => console.log(linke)); 
       return categories.id 
      })); 
} 

我想也许你并不想仍然是map内部在这一点?

+0

我正在尝试合并两种方法的结果......这不是正确的方法吗?源代码包含3个项目。我从源代码中获取一个字段,并启动另一个方法,获得一个可观察值并将其合并到第一个字段中。 –

+0

@PhilippeCorrèges - 您可以合并“map”调用之外的结果,也可以将生成的结果合并到“ map'调用,但合并当前所在函数的结果会导致无限循环(无限递归)。 – Igor

+0

如果我设置了** const aff = example.merge(links).subscribe(linke => console.log(linke)); **在地图外部,链接Observable()的可见性不会更高。 –