Javascript RxJS在订阅中订阅不同数量的可观察对象

Javascript RxJS在订阅中订阅不同数量的可观察对象,javascript,angular,typescript,rxjs,ngrx,Javascript,Angular,Typescript,Rxjs,Ngrx,在下面的代码片段中,我订阅了一个公文包并遍历了一个数组。对于数组中的每个成员,我创建另一个订阅以侦听其引用 this.portfolio$ .subscribe(portfolio) => { portfolio.watchlist.all.forEach((a) => { this.store .select((s) => s.quotes.quotes[a._id]) .su

在下面的代码片段中,我订阅了一个公文包并遍历了一个数组。对于数组中的每个成员,我创建另一个订阅以侦听其引用

this.portfolio$
  .subscribe(portfolio) => {
    portfolio.watchlist.all.forEach((a) => {      
        this.store
          .select((s) => s.quotes.quotes[a._id])          
          .subscribe((q) => {
            console.warn('subscription')
          }
      }
    })
  })

有没有RxJS运营商可以让我摆脱外部订阅?最后,我只希望订阅的数量与数组中的引号数量相同。

是的,嵌套订阅是个坏主意,您可能在这里造成了相当严重的内存泄漏

请尝试以下方式:

  this.portfolio$.pipe(
    switchMap(portfolio => {
      return combineLatest(portfolio.watchlist.all.map(
        a => this.store.select(s => s.quotes.quotes[a.id])
      ))
    })
  ).subscribe(combinedQ => console.log(combinedQ))

在这里,您使用
switchMap
切换到一个新的流,它是
combinelateest
中组合的所有可观察对象,将在一个数组中发出所有最新值。

是嵌套订阅是一个坏主意,您可能在这里造成了相当严重的内存泄漏

请尝试以下方式:

  this.portfolio$.pipe(
    switchMap(portfolio => {
      return combineLatest(portfolio.watchlist.all.map(
        a => this.store.select(s => s.quotes.quotes[a.id])
      ))
    })
  ).subscribe(combinedQ => console.log(combinedQ))
在这里,您可以使用
switchMap
切换到一个新的流,该流是在
combinelateest
中组合的所有观察值,它将在一个数组中发出所有最新的值