javascript - Angular 订阅被调用两次

标签 javascript angular typescript observable

我有一系列遵循以下逻辑的可观察值: getStyles() --> getPrices()

对于 configs 中的每个 config.id,getStyles() 返回一个样式对象,该样式对象被传递给 getLease,其中附加价格,然后推送到名为“style”的数组

  getStyles(configs: any) {
      configs.forEach(config => {
           this._APIService.getStyleByID(config.id).subscribe(
                res => {
                    res.config = config;
                    this.getLease(res);
                }
           );
    });

  }

  getLease(style: any): void {
      this._priceService.getPrice().subscribe(
        price => {
            style.price = price;
            this.garage.push(style);
            console.log(this.garage);
        });
  }


}

我遇到的问题是,由于样式数组的样式对象数量是所需数量的 2 倍,因此进行了重复调用。问题是 Angular 正在调用 this._APIService.getStyleByID() 两次,而我希望它调用一次。如何修复我的 Observables 仅被调用一次?

最佳答案

尝试 switchMap,它类似于 mergeMap,但如果它发生更改,它会取消最后一个请求:

  getStylesWithoutYear(): void {
    this._APIService.getStylesWithoutYear()
      .switchMap(styles => {
         styles.years.forEach(year => {
          year.styles.forEach(style => {
              this._APIService.getStyleByID(style.id)
           })
         })
      })
      .subscribe(style => {
        console.log('style', style)
      })
  }

关于javascript - Angular 订阅被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44009784/

相关文章:

Angular 2,如何在全局范围内激活路由?

在部署时运行 ng build 后 Angular 路由不起作用

javascript - 如何更改 Angular 2中的currentUrl id?

javascript - node.js mongojs findOne 回调返回错误为空

javascript - AngularJS Controller 中定义的 JS 函数不起作用

javascript - 淡出文本并淡入下一个 Canvas

javascript - 导入自定义模块时获取 'Cannot read property ' ɵmod' of undefined' [Angular 11]

javascript - 使用 touchstart 还是 mousedown?

TypeScript:使用 0 个或多个参数调用重载的 asyncPipe

javascript - 无法为带有字符串作为参数的 Angular 组件创建构造函数