角度-将两个可观察结果合并为一个

时间:2018-09-04 12:04:20

标签: javascript angular typescript rxjs observable

我的数据库中有两个节点-一个是allUsers,另一个是usersChildren

例如:

allUsers: { user1: {...}, user2: {...}}
usersChildren: { user1: {...} }

在这种情况下,user1有子数据,而user2没有子数据。

我想检索所有用户对象的列表,并希望在每个用户对象内添加usersChildren节点(如果有)中的子数据。

但是,我对如何做到这一点并不十分熟悉。我已经尝试了以下方法,但这导致仅获得儿童信息,而没有获得 具有子级信息和用户元数据的组合对象。

this.af.getObservable(`allUsers`).pipe(map(allUsers =>
    allUsers.map(user => this.af.getObservable(`usersChildren/${user.id}`)))
   .subscribe(allUsersData => this.userList = allUsersData);

实现我想要的最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

尝试一下

this.af.getObservable(`allUsers`)
  .pipe(
    mergeMap(users => forkJoin(
      users.map(user => this.af.getObservable(`usersChildren/${user.id}`))
    ))
  );

您进行HTTP调用以获取所有用户,然后使用forkJoin对每个用户进行1次调用。感谢Array.map进行呼叫,该呼叫将您的用户转换为HTTP呼叫。

现在您可以像这样订阅它

this.myService.getAllUsers().subscribe(users => { console.log(users); });

答案 1 :(得分:0)

在您的情况下,我会使用 concat 运算符。

Concat会将两个可观察对象合并为一个组合序列,但是第二个可观察对象将在第一个可观察对象完成之前开始发射。

示例:

let first = Observable.timer(10,500).map(r => {
  return {source:1,value:r};
}).take(4);
let second = Observable.timer(10,500).map(r => {
  return {source:2,value:r};
}).take(4);
first.concat(second).subscribe(res => this.concatStream.push(res));