代码之家  ›  专栏  ›  技术社区  ›  arunmmanoharan

嵌套订阅并需要所有值作为主体传递到API-Angular 6 RXJS

  •  2
  • arunmmanoharan  · 技术社区  · 6 年前

    我正在开发一个表组件,表组件的数据将根据三个下拉值进行填充。我需要将这三个值都传递给API以获得所需的响应。我可以使用嵌套的订阅来实现它,这是一种非常糟糕的方法。但是任何更改都会多次调用API。我怎么修?我发现的大多数例子是只获取最终的订阅值,但在我的例子中,我需要这三个值。任何实现使用的建议 tap flatMap ?

    请教。

        this._data.currentGroup.subscribe(bg => {
            this.bg = bg;
    
            this._data.currentUnit.subscribe(bu => {
                this.bu = bu;
    
                this._data.currentFunction.subscribe(jf => {
                    this.jf = jf;
    
                    this.apiService.getFunctionalData(this.bg, this.bu, this.jf)
                    .subscribe(
                      (data) => {
                        console.log(data)
                      }
                    );
    
                });
            });
        });
    

    这就是我所做的。

        this._data.currentGroup.pipe(
            tap(bg => this.bg = bg),
            flatMap(bu => this._data.currentUnit.pipe(
                tap(bu => this.bu = bu),
                flatMap(jf => this._data.currentFunction.pipe(
                    tap(jf => this.jf = jf)
                ))
            ))
        ).subscribe();
    

    这是我的示例 dataService . 我初始化我的 dataservice 在表组件的构造函数中 _data .

        changeGroup(bg: string) {
          this.changeGroupData.next(bg);
        }
    
        private changeGroupData = new BehaviorSubject<string>('');
        currentChangeGroup = this.changeGroupData.asObservable();
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Kim Kern    6 年前

    你可以使用 combineLatest 把这三个观测点结合起来,然后一次订阅所有的观测点。一旦三个观测值中的一个发生变化,它就会发出一个新的值。

    combineLatest(this._data.currentGroup,
                  this._data.currentUnit,
                  this._data.currentFunction).subscribe(([bg, bu, jf]) => {
            // do stuff
          });
    

    例如,看看这个 stackblitz demo 我创造了。