Angular http请求的连接

时间:2017-01-17 16:25:37

标签: angular rxjs angular2-http

我面临以下情况。 有一个前端应用程序,使用Angular(2)构建,与REST后端连接,可通过http访问。 一旦用户登录(使用电子邮件和密码),后端将返回与用户相关的数据,特别是与用户关联的ID(让我们称之为 userId )以及其中的区域代码他活着(让我们称之为 regionId )。 通过 userId ,我可以查询后端以获取用户所属的关联组ID(让我们称之为 affinityId )。 最后,使用 affinityId regionId ,我可以从后端检索折扣以应用于用户。

换句话说,后端提供3个API:

  • getUserData(email:string,pwd:string):返回所有用户数据,包括 userId regionId
  • getAffinityPerUser(userId:number):返回表示 affinityId
  • 的数字
  • getDiscount(regionId:number,affinityId:number):返回代表折扣的数字

如果我通过Angular http客户端访问这些API,我可以构建以下API(在一种Javascript伪代码中)

  • getUserData(email:string,pwd:string):Observable(< {userId, regionId,...}>)
  • getAffinityPerUser(userId:number):Observable()
  • getDiscount(regionId:number,affinityId:number): 可观察到的()

我想知道我是否可以使用RxJs运算符组合这些Observable来获取我正在寻找的折扣信息。

我可以通过switchMap连接前两个API,以获得 affinityId ,类似

this.getUserData(email, pwd)
     .switchMap(userData => this.getAffinityPerUser(userData.userId))

但后来我不知道如何将 affinityId Observable(由getAffinityPerUser返回)与userData Observable(由getUserData返回)结合起来,以便能够同时使用我需要调用getDiscount API的 affinityId regionId

非常感谢任何帮助

1 个答案:

答案 0 :(得分:3)

您可以将所有操作组合在一起:

this.getUserData(email, pwd)
     .switchMap(userData => this.getAffinityPerUser(userData.userId)
                                .map(affinity => [affinity, userData.regionId])) // return a tuple combining required elements
     .switchMap(([affinity, regiondId) => this.getDiscount(regionId, affinity)) // use destructuration to extract the 2 elements of the tuple