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

Angular 2和RxJS:如何更改返回Observable的HTTP调用,angular,rxjs,observable,angular2-observables,Angular,Rxjs,Observable,Angular2 Observables,如何更改此函数以使用下面描述的JSON更改 当前函数返回一个可观察的,但是使用新的JSON,添加了新的admin对象。新功能应能成功观察现有的用户数组和新的管理员数组 getData(): Observable<User[]> { return this.http .get('www.example.com/api/users) .map((r: Response) => r.json().assets.users as User[]); } …现在返回两

如何更改此函数以使用下面描述的JSON更改

当前函数返回一个
可观察的
,但是使用新的JSON,添加了新的
admin
对象。新功能应能成功观察现有的
用户
数组和新的
管理员
数组

getData(): Observable<User[]> {
  return this.http
    .get('www.example.com/api/users)
    .map((r: Response) => r.json().assets.users as User[]);
}
…现在返回两个数组,
users
admins

{
"assets": {
    "users": [
        // array of user objects
    ],
    "admins": [
        // array of admin objects
    ]

}

请假设我的代码已经创建了
User
Admin
类,它们正确地反映了返回的相关JSON对象的属性。

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

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():可观察{
返回此文件。http
.get('www.example.com/api/users'))
.map((r:Response)=>{
const assets=r.json().assets;
返回{
用户:assets.users作为用户[],
管理员:assets.admins作为管理员[]
}
});
}
或者像这样:

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[]
         ]
     });
}
getData():可观察{
返回此文件。http
.get('www.example.com/api/users'))
.map((r:Response)=>{
返回[
assets.users作为用户[],
assets.admins作为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[]
         ]
     });
}
getData():可观察{
返回此文件。http
.get('www.example.com/api/users'))
.map((r:Response)=>{
返回[
…assets.users作为用户[],
…assets.admins作为管理员[]
]
});
}

如果您希望在同一数组中同时返回用户和管理员,则应使用以下代码:

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);
    }
}
结果将等于:

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

正如我在@Maximus answer的评论中所解释的那样,
.map()
用于将数组转换为新数组,这就是为什么要将函数馈送到
.map()
以告诉它您要查找的数组。

那么您想要什么呢?不清楚谢谢你的反馈。我在问题的开头添加了更多的细节。新函数应该成功地观察到-通过观察,您的意思是从两个数组返回对象吗?或者返回两个数组?第一个:从两个数组返回对象。但这不是它的工作方式,它返回一个用户数组,而不是用户对象来解释这里发生了什么:
.map()
使用它附加到的数组中的值返回一个新数组。因此,为了返回一个包含用户和管理员的新数组,需要在
.map()
中使用一个函数将响应数据转换为新的所需数组。我可以这样说吗?你们两个摇滚!对于RxJS新手来说,这是一个很好的回答和解释。我现在将致力于实现这一点。我希望我的编辑能有所帮助。我试着按照指导方针和“展示研究成果”,但我可能有点迷失了方向。@Maximus你能解释一下你最终答案中“…资产”中的省略号吗?@JerryHuckins,当然,这就是所谓的扩展语法,并且已经解释过了。如果有帮助,请考虑接受我的回答。Thanks@Maximus我接受了你的回答。如果你发现这个问题有用,请考虑它的投票。