[英]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"}]
这是我对users
和homework
两个观察值:
let usersObservable = this.af.getObservable(`users/`);
let hwObservable = this.af.getObservable(`homework/`);
基本上,您需要做两件事,但是可能需要考虑一些细节。
第一步可以通过使用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.