Заполнение полей в наблюдаемой, с результатами из другой наблюдаемой в Typescript - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть два запроса.

/users и /user/<id>/milpac

/users приводит к наблюдаемой User[], в то время как /user/<id>/milpac приводит к объекту milpac.

export class User {
  join_date: string;
  promotion_date: string;
  user_id: number;
  username: string;
  milpac: Milpac;
}

export class Milpac {

  user_id: number;
  milpac_id: number;
  real_name: string;
  username: string;
  rank: string;
  rank_shorthand: string;
  status: string;
  primary_position: string;
  bio: string;
  join_date: string;
  promotion_date: string;
}

Сначала я получил всех пользователей с помощью:

getAll(): Observable<User[]> {
    const headers = new HttpHeaders({
      'Content-Type': 'application/json',
      'Authorization': this.API_AUTH_HEADER
    });
    const options = { headers: headers };
    return this.http.get<UserResult>(this.API_URL + '/users/active', options).pipe(map(r => r.data.users));
  }

Затем, через некоторое время, стало требованием загрузить milpac в пользователя:

getMilpac(userId: number): Observable<Milpac> {
    const headers = new HttpHeaders({
      'Content-Type': 'application/json',
      'Authorization': this.API_AUTH_HEADER
    });
    const options = { headers: headers };
    return this.http.get<MilpacResult>(this.API_URL + `/user/${userId}/milpac`, options).pipe(map(r => r.data));
  }

Моя цель теперь состоит в том, чтобы каким-то образом загрузить Milpac в объект User, используя объект User, и в конечном итоге выдать его в наблюдаемом потоке.

Результат наблюдаемого долженоставайтесь User[], но заполните поля Milpac за User.

Я знаю, что функции mergeMap и т. д. существуют, но я просто не могу заставить их работать.Есть ли кто-нибудь, кто может указать мне правильное направление?

1 Ответ

0 голосов
/ 30 декабря 2018

Как уже упоминалось - это должно быть сделано на сервере.Если вам все равно нужно сделать это на клиенте, вы можете сделать это следующим образом:

  1. Используйте Array.from, чтобы разделить пользователей, чтобы вы получали по одному
  2. mergeMap каждый пользователь со своим балансом счета и немедленно передает результат пользователю
  3. Позвоните toArray, чтобы вернуть своих пользователей в виде массива

Я создал упрощенную витрину здесь: https://stackblitz.com/edit/rxjs-6mivga

Обратите внимание, что это работает только в том случае, если ваш поток завершается (в противном случае массив toArray никогда не будет генерироваться).Если это не так, то это немного сложнее, но механизм остается прежним.

...