Angular 2和RxJS:如何更改返回Observable的HTTP调用

时间:2017-07-14 19:33:25

标签: angular rxjs observable angular2-observables

如何更改此功能以使用下面描述的JSON更改?

当前函数返回admin,但是使用新的JSON,添加了新的users对象。新函数应成功观察现有的admins数组和新的getData(): Observable<User[]> { return this.http .get('www.example.com/api/users) .map((r: Response) => r.json().assets.users as User[]); } 数组。

/api/users

JSON从{ "assets": { "users": [ // user objects ] }

返回
users

...现在返回两个数组,admins{ "assets": { "users": [ // array of user objects ], "admins": [ // array of admin objects ] }

User

请假设我的代码已经创建了Admin和{{1}}个类,这些类正确反映了返回的相关JSON对象的属性。

2 个答案:

答案 0 :(得分:1)

嗯,您有几个选项可以返回数据:

getData(): Observable<User[]> {
  return this.http
    .get('www.example.com/api/users')
    .map((r: Response) => { 
         const assets = r.json().assets;
         return {
             users: assets.users as User[],
             admins: assets.admins as Admin[]
         }
     });
}

或者像这样:

getData(): Observable<User[]> {
  return this.http
    .get('www.example.com/api/users')
    .map((r: Response) => { 
         return [
             assets.users as User[],
             assets.admins as Admin[]
         ]
     });
}

或者像这样:

getData(): Observable<User[]> {
  return this.http
    .get('www.example.com/api/users')
    .map((r: Response) => { 
         return [
             ...assets.users as User[],
             ...assets.admins as Admin[]
         ]
     });
}

答案 1 :(得分:1)

如果要在同一个数组中返回用户和管理员,以下代码应该可以解决问题:

getData(): Observable<User[]> {
  return this.http
    .get('www.example.com/api/users)
    .map((r: Response) => {
        var results = r.json();
        return results.assets.users.concat(results.assets.admins);
    }
}

使用以下数据:

{
"assets": {
    "users": [
        { "name": "bob" }, { "name": "john" }
    ],
    "admins": [
        { "name": "jill" }, { "name": "donald" }
    ]

}

结果将等于:

[ { "name": "bob" }, { "name": "john" }, { "name": "jill" }, { "name": "donald" } ]

正如我对@Maximus回答的评论中所解释的,.map()用于将数组转换为新数组,这就是为什么要将函数提供给.map()以告诉它你是什么数组的原因正在寻找。