繁体   English   中英

将RXJS可观察的结果合并为一个

[英]Combine RXJS observable results into one

我的数据库中有两个节点:

users: {user1: {uid: 'user1', name: "John"}, user2: {uid: 'user2', name: "Mario"}}
homework: {user1: {homeworkAnswer: "Sample answer"}}

有些用户可能有功课,也可能没有。

我想通过一次调用就获得所有用户的列表以及每个用户的作业数据,然后进行订阅。 实现这一目标的最佳方法是什么?

对于上面的示例,获得的列表如下所示:

[{uid: 'user1', name: "John", homework: {homeworkAnswer: "Sample answer"}}, {uid: 'user2', name: "Mario"}]

这是我对usershomework两个观察值:

let usersObservable = this.af.getObservable(`users/`);
let hwObservable = this.af.getObservable(`homework/`);

基本上,您需要做两件事,但是可能需要考虑一些细节。

  1. 从两个可观察对象获取数据。
  2. 将数据转换为所需的结果。

第一步可以通过使用forkJoin轻松实现。 forkJoin您可以传入多个可观察对象,并且所有可观察对象完成后它将发出一个值。 重要提示: forkJoin仅在完成后发出。 如果您的数据来自商店或主题,则可能必须添加take(1)运算符,这样它才能真正完成。

转换部分也应该很容易。 我假设您要拥有用户对象中存在的所有用户,因此我们可以使用Object.keys遍历现有用户键,然后使用map转换数据。

// Imports:
import { forkJoin } from 'rxjs';
import { take } from 'rxjs/operators';

// Step 1: Use fork join to get the result from both observables
forkJoin(
    // pipe(take(1)) is only needed if the observables don't complete.
    usersObservable.pipe(take(1)), 
    hwObservable.pipe(take(1))
)
    // Step 2: Transform the data.
    // We now need to map our both results. We want to return all
    // users and add the homework if available. So we can user
    // Object.keys to iterate over the existing user keys in your object.
    .pipe(map(([users, homeworkMap]) => Object.keys(users)
        // Now we can map the keys to the actual user objects
        // and merge them with the homework
        .map(userKey => {
            const user = users[userKey];
            const homework = homeworkMap[userKey];
            return {
                ...user,
                homework
            };
        })
    ))
    .subscribe(users => console.log('Users: ', users));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM