Наблюдаемый поток, значения которого обогащены другими «однократными» наблюдаемыми - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть вспомогательная функция, которая выполняет вызов API и возвращает массив items.Каждый из этих элементов представляет сущность, скажем, User.

У каждого пользователя есть свойство category_id, которое по умолчанию является нулевым.Я хотел бы заполнить это свойство для каждого пользователя из результата другой вспомогательной функции, которая принимает идентификатор пользователя и возвращает объект Observable объекта Category, из которого я могу извлечь идентификатор, который будет использоваться в качестве атрибута category_idпользователь.

Я достиг следующего (псевдо) кода (синтаксис TypeScript, но вопрос применим к наблюдаемым операторам в целом):

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

Естественно, это не такработать, потому что он смешивает наблюдаемые операторы с функциями массива (forEach).

1 Ответ

0 голосов
/ 26 февраля 2019

Вы не должны подписываться на наблюдаемое внутри трубы.Это анти-паттерн.Используйте свою более высокую наблюдаемую и mergeMap с combLatest, чтобы получить то, что вы хотите:

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

Он вернет массив пользователей с их категорией.

...