Angular 使用RxJS检测完成树浏览

Angular 使用RxJS检测完成树浏览,angular,recursion,rxjs,Angular,Recursion,Rxjs,我遇到了RxJS的设计问题。我花了很长时间研究文档,但没有找到任何线索。 所以,如果有人能帮我 我正在浏览从远程主机加载的树。 下面的代码非常简单地总结了流程 public load(id: string) { this.httpClient.get<Result>('https://...', { headers }) .subscribe(result => { result.parents.forEach(parent => {

我遇到了RxJS的设计问题。我花了很长时间研究文档,但没有找到任何线索。 所以,如果有人能帮我

我正在浏览从远程主机加载的树。 下面的代码非常简单地总结了流程

public load(id: string) {
    this.httpClient.get<Result>('https://...', { headers })
      .subscribe(result => {
        result.parents.forEach(parent => {
          this.load(parent.id);
        });
      });
  }
公共加载(id:string){
this.httpClient.get('https://...“,{headers})
.订阅(结果=>{
result.parents.forEach(parent=>{
此.load(父.id);
});
});
}
我的问题很简单。我想检测浏览完成情况。
是否有任何XXXMap的组合来实现这个目标

也许你正在寻找这样的东西:

public loadTree(id: string): Observable<any>{
    return this.load(id)
        .pipe(
            map(res => res.parents)
            mergeMap(
                parents => of(...parents).pipe(
                    mergeMap(
                        (parent) => {
                            return this.loadTree(parent.id);
                        }
                    )
                )
            ),
            toArray(),
        );
}

public load(id: string): Observable<any> {
    return this.httpClient.get<Result>(`https://.../${id}`, { headers });
}
公共加载树(id:string):可观察{
返回此。加载(id)
.烟斗(
映射(res=>res.parents)
合并地图(
parents=>of(…parents).pipe(
合并地图(
(家长)=>{
返回此.loadTree(父.id);
}
)
)
),
toArray(),
);
}
公共负载(id:string):可观察{
返回this.httpClient.get(`https://.../${id}`,{headers});
}

loadTree
调用您的http方法。收到响应后,
map
将获得
parents
数组。在此之后,它将获取您的数组并将其与扩展数组一起拆分为单个
父对象。对于每个
parent
对象,它将再次调用
load
方法
toArray
收集所有内部观察值以匹配起始返回类型。您需要检查代码是否适合您的项目(调用类型/返回类型)。

我认为这与rxjs设计无关。这更多是你的问题要求。你说的“浏览完成”是什么意思?如果你的意思是你想等到最后一刻<代码>父项
已加载。您需要为
父项
数组中的所有条目创建内部可观察项。当所有的内部观测值都发射出这些值时,你就知道你已经失败了。双亲有双亲。要按照您的建议完成父数组,我需要重新调用load函数。也许我错了。但是在我看来,
返回this.load(parent.id)
在结束之前终止浏览。我们只是得到了父母,而我们永远也达不到祖父母你是对的,应该是递归的,编辑它。尝试此操作,然后在ngOnInit或构造函数中启动
this.loadTree(firstId).subscribe()
。一个最小的可复制的示例将非常有用。我将提供一个用于测试的示例数据集。同时,我已经可以放弃你上次的提议了<代码>加载树是一个无效函数。因此,
返回此。loadTree(parent.id)
不工作。应按预期工作。我现在不能试一试。您还可以查看几个解释如何调用递归的博客条目。您也可以使用
flatMap
forkJoin
代替我的
spread
concatMap
,而且字符数的限制使我的生活复杂化,无法提供样本数据。无论如何它正在工作:-)。我检测到完成。我不太确定loadTree发出的结果数据是否是决定性的。但是我可以在管道过程中处理我的需求。