将Observable <b>转换为对象B.

时间:2017-06-04 18:42:13

标签: angularjs typescript rxjs angular2-services

我正在使用Angular 2和RxJs。我得到以下编译异常,

[ts]
Type 'Observable<Observable<B>>' is not assignable to type 
'Observable<B>'.
  Type 'Observable<B>' is not assignable to type 'B'.
    Property 'id' is missing in type 'Observable<B>'.

以下是相关代码。我无法真正改变'getB'的方法签名,因为我正在覆盖它。基本方法不需要第二次API调用来填充子项,因此覆盖。

export interface A {
   b: B;
}

export class B {
   cList: C[];
}

export interface C {
   name: string;
   type: string;
}

getB(): Observable<B> {
   let entries = <A[]> []; // get A[] via an server call
   // in this case entries will have only one element in the array  
   return this.loadBChilds(entries[0])
     .map(e => e.b);
}

loadBChilds(a: A): Observable<A> {
   // API call to fetch childs
   // set childs to a.b.List
   return this.rest.get('someapi')
     .map(res => {
       res.record.map(r => this.setData(r));
       return a; 
     });
}

知道如何实现这个目标吗?

TIA

1 个答案:

答案 0 :(得分:0)

管理解决这个问题。解决方法是通过flatMap折叠从第一个API接收的第一个数组,然后将其用于后续的API调用。

getB(): Observable<B> {
   return this.rest.get('firstapi')
     .flatMap(res => {
         let entries = res.record
              .map(record => this.getEntry(record));
         return this.loadBChilds(entries[0])
          .map(e => e.b);
     });
}