首页 > 解决方案 > 嵌套的可观察对象在终止后一个接一个地执行

问题描述

我正在实施角度解决方案以首先获取数据库中的所有项目,终止后我从数据库中获取当前选定的框,然后将项目映射到框。我需要对所有项目进行收费,然后让盒子在最后进行映射,我有以下代码可以工作,但通过嵌套 observables 有点脏,你们中的任何一个都有更清洁的解决方案吗?我在文档中找到了解决方案 os swithMap 但我认为这不适合我的情况,因为开关映射无法在上可观察到的情况下完成执行内部

this.getItems().subscribe(items => {
        this.itemsInDataBase = items;
    this.loadActiveBox().subscribe(box => {
        this.selectedBox= box;

        this.selectedBox?.versions.forEach((version, index) => {
            this.itemsInDataBase.forEach((itemInDatabase, index) => {
                version.items.forEach((item, index) => {
                        this.insertItemInbox(item, itemInDatabase, version);
                    }
                );
            });
        });

grazie mille

标签: angularrxjs

解决方案


RxJSswitchMap运算符可以用于内部可观察对象依赖于外部可观察对象的情况。在您的情况下,由于两个 observables 似乎是独立的,您可以使用该forkJoin函数。

forkJoin({
  items: this.getItems(),
  box: this.loadActiveBox()
}).pipe(
  tap({
    next: ({items, box}) => {
      this.itemsInDataBase = items;     // <-- are these needed?
      this.selectedBox = box;
    }
  })
).subscribe({
  next: ({items, box}) => {
    box?.versions.forEach(version =>
      items.forEach(itemInDatabase =>
        version.items.forEach(item =>
          this.insertItemInbox(item, itemInDatabase, version)
        )
      )
    )
  },
  error: (error: any) => {
    // handle errors
  }
});

推荐阅读