【问题标题】:Manipulate Observable response操纵 Observable 响应
【发布时间】:2018-07-31 22:46:56
【问题描述】:

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

{Name: 'French', 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) );
}

【问题讨论】:

    标签: angular observable


    【解决方案1】:

    这将创建一个数组,其中每个对象都有 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) );
    }
    

    【讨论】:

    • 这很有趣。如果我将该行添加为: o => {...o, Type: o.Dbms ,“...”的原因是什么? 'DB' : 'File/Folder'}) 我的源代码 (338,49) 的其他位置出现错误:找不到名称 'editMode'。
    • 我这样做了: .map(data => data.map( item => item.Type = item.Dbms ? 'DB' : 'File/Folder' ) ) 我进入了我的结果只有类型(没有其他字段)
    • 已编辑,现在重试。 "..." 是 es6 中引入的扩展运算符。
    • 像魅力一样工作,非常感谢...为我节省了很多时间。
    • 如果我想更改现有值怎么办?当前路径检索为 URI:file:///C:/TDF/TDFApplicationData/files/KnowledgeBase/french.csv 我想使用 vscode-uri (stackoverflow.com/questions/37658425/…) 将其显示为路径
    【解决方案2】:

    使用映射运算符后,结果是字符串值DB 或File/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) );
    }
    

    【讨论】:

    • 感谢您的回复。我需要它在同一个对象中。也试过了,但还是没有运气: return this.http.get(url) .map( (response) => response.json() ) .map(({Name, Dbms, Host, Port, DbName, Uri}) => new GlobalResource(Dbms ? "DB" : "File/Folder" , Name , Dbms , Host , Port , DbName , Uri) )
    • 获取:输入'Observable' 不可分配给类型 'Observable'。
    • 我将更新我的答案箭头函数 () => 这将失败
    • 旧对象将是数据属性
    • 你的意思是响应 continue a list of db 和 file 吗,在这种情况下获取 file 和 db 的列表怎么样,你有一个对象包含但又分开
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2021-09-01
    • 2021-12-15
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多