【问题标题】:Angular - Combine two observables results into oneAngular - 将两个可观察结果合二为一
【发布时间】:2019-02-09 11:11:47
【问题描述】:

我的数据库中有两个节点——一个是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);

实现我的愿望的最佳方式是什么?

【问题讨论】:

    标签: javascript angular typescript rxjs observable


    【解决方案1】:

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

    Concat 会将两个 observable 组合成一个组合序列,但第二个 observable 在第一个完成之前不会开始发射。

    例子:

    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));
    

    【讨论】:

      【解决方案2】:

      试试这个

      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); });
      

      【讨论】:

      • 这样我没有得到任何结果。就像 forkJoin 根本不发出订阅一样。你能提供一个解决方法吗?
      • 如果这段代码没有被触发,那么你之前的代码也不会被触发。您一定更改了其他内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2021-10-31
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      相关资源
      最近更新 更多