我有一个辅助函数,该函数进行API调用并返回items
的数组。每个项目都代表一个实体,比方说User
。
每个用户都有一个category_id
属性,默认情况下为空。我想为每个用户从另一个帮助程序函数的结果填充此属性,该函数使用一个用户ID并返回Category对象的Observable,我可以从中提取ID用作category_id
用户的属性。
我已经到达以下(伪)代码(TypeScript语法,但该问题通常适用于Observable运算符):
this.backend
.request(
'v1/users',
)
.pipe(
map(items => {
items.forEach(user => {
this.categories.getName(user['id']).subscribe(category => {
user['category_id'] = category['id'];
});
});
return items;
})
)
自然地,这是行不通的,因为它将Observable运算符与Array函数(forEach)混合在一起。
答案 0 :(得分:1)
您不应订阅管道中的可观察对象。这是一种反模式。 将您的较高可观察性和mergeMap与CombineLatest结合使用,即可获得所需的内容:
this.backend
.request(
'v1/users',
)
.pipe(
mergeMap(items => {
const requestUserWithCatArray = items.map(user => this.categories.getName(user['id']).pipe(
map(category => {
user['category_id'] = category['id'];
return user;
})
));
return combineLatest(requestUserWithCatArray);
})
);
它将返回一组用户及其类别。