操纵可观察的响应

时间:2018-07-31 08:00:59

标签: angular observable

我有一个从对Observable对象的rest api调用中检索到的资源列表。 这些资源可以具有以下值:

  

{名称:“法语”,Uri:“ file:/// C:... / french.csv”},   {名称:“ DB2”,Dbms:“ DB2”,主机:“ ...”,端口:50000,DbName:“ ...”}

我需要基于Dbms值确定资源是数据库资源还是文件资源,以便稍后在表的“类型”列中显示并能够对其进行过滤...

我认为地图是最好的选择,但仍然无法弄清楚究竟是什么:

 getResources(user): Observable<Array<any>> {
    const url = this.url + this.apiAllowedPath + user + '/resources';
    return this.http.get(url)
        .flatMap((response) => response.json())
        .map( (response) => response.Dbms ? "DB : File/Folder"; )
        .catch((response: Response) => this.errorHandler(response) );
}

2 个答案:

答案 0 :(得分:0)

使用了地图运算符后,结果是字符串值DBFile/Folder 所以您没有实际的服务器响应;

您可以这样做

interface DataResponse{
  db:any[];
  file:any[];
}

getResources(user): Observable<DataResponse> {
   const url = this.url + this.apiAllowedPath + user + '/resources';
   return this.http.get(url)
            .flatMap((response) => response.json())
            .map( (response) =>{ 
                 let db = response.filter(i => response.hasOwnProperty('Dbms') );
                 let file = response.filter(i =>!response.hasOwnProperty('Dbms'));
                return {db,file}
                })
            .catch((response: Response) => this.errorHandler(response) );
}

答案 1 :(得分:0)

这将创建一个数组,其中每个对象都具有显示其源类型的type属性。

getResources(user): Observable<Array<any>> {
    const url = this.url + this.apiAllowedPath + user + '/resources';
    return this.http.get(url)
        .map(response => response.json())
        .map(data => data.map(o => ({
          ...o, 
          type: o.Dbms ? 'DB' : 'FILE',
          path: Uri.parse(o.Uri).fsPath
         })))
        .catch((response: Response) => this.errorHandler(response) );
}