0

很长一段时间以来,我一直在努力解决以下问题。

...

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 是

/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 数组的 observable

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) 的 rplans。

如何修改它以返回一个包含所有 3 个文档的 rplan 的数组?

谢谢

4

2 回答 2

1

尝试flatMap

flatMap((doc) => doc.rplans). 理想情况下,这将从数组数组中生成一维数组。

于 2019-04-02T19:41:55.467 回答
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)
于 2019-04-27T06:45:33.973 回答