循环可观察数组,并与每个元素的其他可观察数组合并

时间:2019-09-10 17:50:38

标签: angular rxjs

我有两个单独的函数,它们返回不同的可观察值。

getCities(): Observable<City[]>

例如[{city: 'Amsterdam'}, {city: 'Rotterdam'}]

getLocations(city: string): Observable<CityLocation[]>

例如getLocations('Amsterdam')将返回[{location: 'Westpoort'}, {location: 'Amsterdam-Noord' }]

我想将这两者结合起来,并具有返回如下所示的可观察对象的功能:

[ {city: 'Amsterdam', locations:[{location: 'Westpoort'}, {location: 'Amsterdam-Noord'}]}, {city: 'Rotterdam', locations: [{...}, {...}]} ]

因此,基本上,该功能应该在城市之间循环,然后对于每个城市,它都应该获取位置并将所有内容合并到一个可观察的位置。

这就是我现在拥有的:

getCombined() { return this.getCities().pipe( mergeMap(cities => { return from(cities).pipe( mergeMap( city => this.getLocations(city.city), (original, detail) => ({ ...original, locations: detail }) ), toArray(), map(locations => ({ ...cities, locations })) ); }) ); }

但是不幸的是,它不起作用,并且控制台中没有错误。我不确定自己在做什么错。

编辑:

Stackblitz编辑器:https://stackblitz.com/edit/angular-32wman

1 个答案:

答案 0 :(得分:1)

根据我的理解,您可以使用forkJoin进行请求,还可以将位置添加为每个城市的数组。您修改的代码:

getCombined() {
  return this.getCities().pipe(
    mergeMap(cities => forkJoin(
      cities.map(c => this.getLocations(c.city).pipe(
        map(locations => {
          c.locations = locations;
          return c;
        })
      ))
    ))
  );
}

STACKBLITZ