结合两个可观察到的嵌套可观察角度?

时间:2018-09-04 15:33:26

标签: angular rxjs

如何合并两个可观察值并在第二个可观察值返回时返回新的可观察值取决于第一个可观察值。 在这里,我期待一个新对象,它是第一个的几个值和第二个的几个值的组合。

export interface EmpData {
  id: number;
  name: string;
}

export const EMPDATA: EmpData = {
    id : 11, name : 'xyz'
};

 export interface EmpDetails {
  id: number;
  desiganation: string;
}

export const EMPDATAILS: EmpDetails = {
    id : 11, desiganation : 'manager'
};

  getEmpData(name: string): Observable<EmpData> {
   // search based on name and return object 
   // temporary returning some data
    return of(EMPDATA);
  }

  getEmpDetails(id: number): Observable<EmpDetails> {
  // search based on id and return object 
   // temporary returning some data
    return of(EMPDATAILS);
  }

  getEmploye(name: string): Observable<any> {
    return this.getEmpData(name).pipe(
      flatMap((response) => {
        return this.getEmpDetails(response.id);
    );
  });

 this.getEmploye(xyz).subscribe(response =>
     // here I'm expecting response as below, i.e. combination of first and 
     //second observable
      //{ 
      //  id: 11,name:'XYZ', desiganation : 'manager'
      //}

2 个答案:

答案 0 :(得分:3)

getEmploye(name: string): Observable<any> 
{
    return this.getEmpData(name).pipe(
      switchMap((response) => {
        return forkJoin(of(response),this.getEmpDetails(response.id);
    ),
    map(res=>{return {...res[0],...res[1]}}))
}

您获得this.getEmpData。然后返回响应和this.getEmpDetails的并集的jorkJoin。最后,您将结果映射为具有两个属性的uniqe对象

注意:如果您想将主要数据和详细数据分开,则最后一张地图可以像

map(res=>{return {...res[0],detail:res[1]}}))

答案 1 :(得分:1)

您可以使用

Observable.forkJoin

在这个最佳角度样板项目文件中,我也可以向您展示如何使用它: Link to usage in ngir project

希望有帮助。