Javascript 我打了两次电话

Javascript 我打了两次电话,javascript,angular,typescript,observable,Javascript,Angular,Typescript,Observable,我有一个遵循以下逻辑的观察链: getStyles()-->getPrices() 对于configs中的每个config.id,getStyles()返回一个style对象,该style对象被传递给getLease,在getLease中追加一个价格,然后被推送到一个名为“style”的数组中 我遇到的问题是,由于样式数组的样式对象数量是它需要的2倍,因此进行了重复调用。问题是Angular调用了两次。_APIService.getStyleByID(),而我希望它调用一次。如何将我的观察值修改

我有一个遵循以下逻辑的观察链: getStyles()-->getPrices()

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


我遇到的问题是,由于样式数组的样式对象数量是它需要的2倍,因此进行了重复调用。问题是Angular调用了两次。_APIService.getStyleByID(),而我希望它调用一次。如何将我的观察值修改为只调用一次?

尝试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)
      })
  }

它调用getStyleByID两次,因为它位于getStylesWithoutYear@Yeysides它为loopwell中的每个元素调用两次,您将被getStylesWithoutYear的变化结果所替代,因此当它的值被更新时,它可能会调用多次。尝试使用mergeMap,然后订阅最终样式。@是的,我多次调用同一订阅。如何使用合并地图?为了清楚起见,我使用subscribe提取响应,并出于同样的原因将其推送到另一个订阅。如果我误用了观测值,请告诉我。另外,如果你能详细说明mergeMap以及我的代码看起来有什么不同,我会给你打上正确的标记。是的,很抱歉,这是正确的,但是这个订阅中的样式应该是style@Moshe把这个还给我。getStyleByID@Moshe那你就把它作废吧,我当时没有签名first@Moshe所以你试着让它无效,它以'style.year.forEach'和'this.getStyleByID'两种格式返回?@Moshe-ohh所以this.getStyleByID不返回任何内容。它需要返回一个可观察的,或者只是使它返回的w.e是可观察的。
  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)
      })
  }