如何从Firebase可观察对象返回转换对象,其中必须从另一个Firebase可观察对象返回嵌套值?

时间:2017-06-22 16:59:45

标签: angular typescript firebase rxjs observable

根据标题,我使用database.object方法从Firebase检索成员的个人资料,并在Angular 4应用的个人资料视图控制器中订阅。

目前,我可以很好地获取所有这些个人资料信息,并且数据在我的Firebase控制器中发生变异。

对于某些背景:

  • 在我的个人资料对象中,有一个管理员用户的ID,负责对个人资料进行一些更新
  • 使用该ID,我需要从Firebase中抓取一个用户对象,其中包含管理员用户的名字等进行更改的内容

以下是我正在做的事情的简化示例:

firebase.controller.ts

public getMemberProfile(id: string): Observable < IProfile > {
  return this.database.object(`${MEMBERS_PATH}/${id}`).map(member => this.transformMember(member))
}

public getAdminUser(id: string): Observable < IUser > {
  return this.database.object(`${USERS_PATH}/${id}`).map(user => user)
}

private transformMember(member): IProfile {
  return {
    aboutUserObj: this.getAdminUser(member.adminUserId).subscribe((adminUser)=> {
      return adminUser // Of course this does NOT work
    }),
   // Other stuff
  }
}

profile.controller.ts

this.memberFirebase.getMemberProfile(this.id).subscribe((profile) => {
  this.profile = profile
})

正如您可以从减少的案例中看到的那样,我加载成员是先决条件,然后使用成员对象获取我需要的管理员用户所需的ID,以便列出此配置文件的更新。观点。

问题

如何成功加载该成员,然后从Firebase中随后添加其他用户信息,以便将所有这些信息作为一个包含完整变异配置文件的observable返回?

我特别想知道什么是最佳实践&#39;可能看起来像这种情况。

提前致谢!我希望这很清楚,如果没有,请随意提出改进建议。

1 个答案:

答案 0 :(得分:1)

你想要像flatMap这样的东西,你可以链接observables

this.getMemberProfile(id).flatMap(
    res => {
        // get id from res of first observable
        let adminId = res.id;

        return this.getAdminUser(adminId);
    }
)
.map(res => {
    // do other transformation as needed
    return res;
})

然后你会订阅这个链式可观察序列。

这是flatMap https://coryrylan.com/blog/angular-multiple-http-requests-with-rxjs

上的一个很好的资源