Angular 如何使用flatMap嵌套对象?

Angular 如何使用flatMap嵌套对象?,angular,typescript,Angular,Typescript,我希望查询不同的rest资源,并希望将结果合并到单个对象中。它是一个用户对象,每个用户都应该包含一个角色。我已经读到我可以使用flatMap来做这件事,但我不能让它工作: public getUsers(): Observable<User[]> { var users: Observable<User[]> = this.someService.getUsers('[A_URL]') // returns Observable<User[]> .f

我希望查询不同的rest资源,并希望将结果合并到单个对象中。它是一个用户对象,每个用户都应该包含一个角色。我已经读到我可以使用flatMap来做这件事,但我不能让它工作:

public getUsers(): Observable<User[]> {
  var users: Observable<User[]>  = this.someService.getUsers('[A_URL]') // returns Observable<User[]>
  .flatMap(res=> {
      // for every user call resource 'role' and add it to user object one by one ...
      // return this.someService.getRoleByUser('[A_URL_WITH_USERID]')
    }.map(res=>{
      //add role to user object
      // user.role = r;
    });
  );
  return users;
}
public getUsers():可观察{
var users:Observable=this.someService.getUsers('[A_URL]')//返回Observable
.flatMap(res=>{
//对于每个用户调用资源“角色”,并将其逐个添加到用户对象。。。
//返回此.someService.getRoleByUser(“[A\u URL\u WITH\u USERID]”)
}.map(res=>{
//向用户对象添加角色
//user.role=r;
});
);
返回用户;
}

我为伪代码感到抱歉,但我真的不理解语法。问题是,第二次资源调用需要第一次调用中每个用户的id。

以下是如何做到这一点:

//此obs发送所有用户的单个数组。
//类似于“.getUsers()”方法将返回的内容
const usersArray=Rx.Observable.of([
{id:1,名称:'user1'},
{id:2,名称:'user2'},
{id:3,名称:'user3'}
]);
//获取给定用户的角色。
const userRoles=函数(userId){
返回Rx.Observable.of(`Role for user${userId}`);
}
const obs=usersArray
//展平阵列。
//现在,每个用户都作为一个单独的值发出。
.mergeMap(val=>val)
//获取用户角色
.mergeMap(用户=>{
返回userRoles(user.id).map(role=>{
//将用户+角色放在一起
user.role=角色;
//别忘了在下面返回
返回用户;
});
})
//此时,您拥有具有“user.role”属性的单个用户
//在溪流中排放的。
//如果需要,取消对阵列的平台化(以获得包含所有用户的单个阵列)
.减少((acc,curr)=>acc.concat(curr),[]);
//最终认购
obs.subscribe(val=>console.log(val));
JS BIN演示此代码:

注:

  • flatMap()
    mergeMap()
    的别名。在RxJS 5(Angular使用的)中,我相信
    mergeMap()
    是“官方”操作符
  • 如果需要保留用户的顺序,请使用
    concatMap()
    而不是
    mergeMap()

以下是您可以做到的方法:

//此obs发送所有用户的单个数组。
//类似于“.getUsers()”方法将返回的内容
const usersArray=Rx.Observable.of([
{id:1,名称:'user1'},
{id:2,名称:'user2'},
{id:3,名称:'user3'}
]);
//获取给定用户的角色。
const userRoles=函数(userId){
返回Rx.Observable.of(`Role for user${userId}`);
}
const obs=usersArray
//展平阵列。
//现在,每个用户都作为一个单独的值发出。
.mergeMap(val=>val)
//获取用户角色
.mergeMap(用户=>{
返回userRoles(user.id).map(role=>{
//将用户+角色放在一起
user.role=角色;
//别忘了在下面返回
返回用户;
});
})
//此时,您拥有具有“user.role”属性的单个用户
//在溪流中排放的。
//如果需要,取消对阵列的平台化(以获得包含所有用户的单个阵列)
.减少((acc,curr)=>acc.concat(curr),[]);
//最终认购
obs.subscribe(val=>console.log(val));
JS BIN演示此代码:

注:

  • flatMap()
    mergeMap()
    的别名。在RxJS 5(Angular使用的)中,我相信
    mergeMap()
    是“官方”操作符
  • 如果需要保留用户的顺序,请使用
    concatMap()
    而不是
    mergeMap()

我相信,
flatMap
确实不存在于RxJS 5:)中。这就是我在“笔记”中写的:)非常感谢。现在它告诉我角色不是用户的属性。如何保留该类型?
角色
属性应该出现在
用户
类型的定义中。您可以使用
{role?:string;}
将第二次合并更改为“mergeMap((user:user)=>{”并开始工作!非常感谢!我相信
flatMap
确实不存在于RxJS 5:)中。这是我在“备注”中写的(:)谢谢。现在它告诉我角色不是用户的属性。我如何保存类型?
角色
属性应该出现在
用户
类型的定义中。您可以使用
{role?:string;}
将第二次合并更改为“mergeMap((用户:用户)=>{”而且很有效!非常感谢!