2017-09-29 78 views
1
private getScmServiceMeta(serviceId: string): Observable<any> { 
    let service = this.getServiceItem(serviceId); 

    if (service) { 
     return this.httpClient.get(serviceUri).map((res: Response) => { 
       return _.get(res, 'data.serviceinfo'); 
      }) 
    } else { 
     return Observable.throw('backend server error'); 
    } 
} 

public inquireScmData(serviceId: string, params: object, templateId: string): Observable<any> { 
    return this.getScmServiceMeta(serviceId).map((serviceInfo: any) => { 

     let uri = serviceInfo.routeTemplate; 

     // How to return the _.get(res, 'data') as an Observable ??? 
     return this.httpClient.get(uri).map((res: Response) => { 
      if (_.startsWith(_.get(res, 'status.code'), '200')) { 
       return _.get(res, 'data'); 
      } else { 
       throw ('status code error'); 
      } 
     }) 
    }) 
} 

如上面的代碼,我需要調用函數「inquireScmData」何時返回可觀察到的,但在函數內部,它需要調用另一個函數「getScmServiceMeta」這也是異步和返回也是一個Observable,所以如何返回'_.get(res,'data')'作爲Observable? 謝謝角HttpClient的返回可觀察到的

+1

return Observable.of(_。get(res,'data')) –

回答

1

rxjs給你一個Observable的靜態方法來做到這一點。

Observable.of(_.get(res, 'data')); 

雖然,您將有一個Observable<Observable<Observable<any>>>。這就是你想要的,或者你只是想鏈接「異步」的操作。如果是這樣,您應該保持原樣,並使用mergeMap

public inquireScmData(serviceId: string, params: object, templateId: string): Observable<any> { 
    return this.getScmServiceMeta(serviceId).mergMap((serviceInfo: any) => { 

    let uri = serviceInfo.routeTemplate; 

    return this.httpClient.get(uri).map((res: Response) => { 
     if (_.startsWith(_.get(res, 'status.code'), '200')) { 
     return _.get(res, 'data'); 
     } else { 
     throw ('status code error'); 
     } 
    }) 
    }) 
} 
+0

不應該在這種情況下使用'switchMap'嗎? –