我有两个单独的函数,它们返回不同的可观察值。
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
答案 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;
})
))
))
);
}