我有一个辅助函数,它进行API调用并返回一个items
数组。这些项目中的每一项代表一个实体,比方说User
。
每个用户都有一个category_id
属性,默认为null。我想为每个用户填充此属性,从另一个辅助函数的结果中获取用户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)混合在一起。
您不应订阅管道中的可观察对象。这是一种反模式。使用更高的observable和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);
})
);
它将返回一组具有类别的用户。