可观察流,其值从其他“一次性”可观察物中得到了丰富

时间:2019-02-26 15:06:28

标签: rxjs observable rxjs-pipeable-operators

我有一个辅助函数,该函数进行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)混合在一起。

1 个答案:

答案 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);
  })
);

它将返回一组用户及其类别。