用Typescript中的另一个可观察结果填充一个可观察的字段

时间:2018-12-30 13:48:42

标签: angular typescript rxjs observable

我有两个要求。

/users/user/<id>/milpac

/users产生一个User[]可观察的物体,而/user/<id>/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 :(得分:0)

如前所述-这应该在服务器上完成。如果您仍然需要在客户端上执行此操作,则可以这样做:

  1. 使用Array.from分散用户,以便一次获得一个人
  2. mergeMap每个拥有帐户余额的用户,并立即将结果发送给该用户
  3. 致电toArray使您的用户重新回到阵列中

我在这里创建了一个简化的展示柜:https://stackblitz.com/edit/rxjs-6mivga

请注意,这仅在流完成时才起作用(否则,toArray将永远不会发出)。如果不是这种情况,它会变得有些复杂,但是机制保持不变。