地图运算符未返回正确的结果

时间:2019-04-02 19:08:11

标签: angular rxjs-pipeable-operators

我一直在努力解决以下问题。

...

export interface HotelRoomType {
  foo: string;
  boo: number;
  rplans: Array<RatePlan>
}

export interface RatePlan {
  prop1: string;
  prop2: boolean;
  prop3: number 
}

doc1: HotelRoomType;
doc2: HotelRoomType;
doc3: HotelRoomType;

ratePlansArr$: Observable<RatePlan[]>;
...

doc1,doc2和doc3是

的Firestore文档
/Company/CompanyId/Room_Types

子集合。

第一个文档如下

doc1 = {
  foo: 'a',
  boo: 1,
  rplans: [
    {
      prop1: 'xxx',
      prop2: true,
      prop3: 512.50
    },
    { 
      prop1: 'yyy',
      prop2: false,
      prop3: 101  
    }
  ]
}

第二个:

doc2 = {
  foo: 'b',
  boo: 9,
  rplans: [
    {
      prop1: 'ooo',
      prop2: false,
      prop3: 90
    },
    { 
      prop1: 'mmm',
      prop2: false,
      prop3: 120.80  
    },
    { 
      prop1: 'nnn',
      prop2: true,
      prop3: 80  
    },
  ]
}

和第三个遵循相同模式的

以下方法(使用AngularFire)返回一个可观察到的RatePlan数组

public getAllRatePlansForCompany(companyId: string): Observable<RatePlan[]> {
    return this._fsSrvc.colWithIds$<RatePlan[]>('Company/' + companyId + '/Room_Types/')
      .pipe(
        map((res, idx) => res = res[idx].Rate_plans)
      );
  }

该方法的调用方式如下:

this.ratePlansArr$ = this.inventoryService.getAllRatePlansForCompany(this.company.id);
this.ratePlansArr$.subscribe();

但是,在执行时,它仅返回第一个文档(doc1)的rplan。

应如何修改以返回包含所有3个文档的rplan的Array?

谢谢

2 个答案:

答案 0 :(得分:1)

尝试flatMap

flatMap((doc) => doc.rplans)。理想情况下,可以从阵列中制造出一维阵列。

答案 1 :(得分:0)

据我所知,您在这里只需要输入一次数据:

 this.ratePlansArr$ = this.inventoryService.getAllRatePlansForCompany(this.company.id);

要获得3个结果,您应该将其命名为三次:

const conpanyIds = [1,2,3];
const arrayOfObservables = conpanyIds.map(id => this.inventoryService.getAllRatePlansForCompany(id))

this.ratePlansArr$ = forkJoin(arrayOfObservables).pipe(
  (arrayOfresults) => arrayOfresults.rplans
)

this.ratePlansArr$.subscribe(console.log)