将一个Observable映射到另一个Observable的数组项中,将结果展平

问题描述 投票:1回答:1

此标题可能需要更多说明。

[基本上,我从后端得到的是一个带有一组赛车手的Observable,并且我要映射另一个属性isOnTrack到每个数组项,该属性包含我从后端检索到的另一个Observable(简单布尔值)。我想展平最终结果,所以我在Observable中没有Observable。我已经尝试了许多rxjs运算符,但无法使其正常工作。

无效的代码:

this.drivers$ = this.db.list('users').valueChanges().pipe(
  map(arr => arr.map( (driver:any) => {
    driver.isOnTrack = this.db.object(`telemetry/${driver.uid}/values/IsOnTrack`).valueChanges();
     return driver
  })),
  mergeAll()
);

这成功将isOnTrack可观察到的映射到数组项,但我无法使其变平。

项目在RxJS 6上

typescript rxjs angularfire rxjs-observables
1个回答
0
投票

模拟数据库功能

// this.db.list('users').valueChanges()
const requestIsOnTrack$ = (id: number): Observable<boolean> => interval(1000).pipe(
  take(3),
  map(() => Math.random() >= 0.5)
)

// this.db.object(`telemetry/${driver.uid}/values/IsOnTrack`).valueChanges()
const requestDrivers$ = () => of([
  {id: 1, name: 'foo'},
  {id: 2, name: 'bar'},
  {id: 3, name: 'baz'},
])

实施

const drivers$ = requestDrivers$().pipe(
  map(drivers => drivers.map(driver => requestIsOnTrack$(driver.id).pipe(
    map(isOnTrack => ({
      ...driver,
      isOnTrack
    }))
  ))),
  mergeAll(),
  mergeAll()
)

说明

  • 从数据库请求所有驱动程序=> observable
  • 请求每个驱动程序的isOnTrack => observable[]
  • 将先前的值映射到新对象=> observable[]
  • mergeAll将您的数组分成多个发射=> merge([observable<observable>, observable<observable>, ...])
  • mergeAll解压缩可观察值的值=> merge([observable, observable, ...])

这里正在运行stackblitz

© www.soinside.com 2019 - 2024. All rights reserved.