1

我有一个辅助函数,它进行 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 运算符与数组函数 (forEach) 混合在一起。

4

1 回答 1

1

您不应该订阅管道中的可观察对象。这是一种反模式。使用更高的 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);
  })
);

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

于 2019-02-26T17:33:19.407 回答