gpt4 book ai didi

angular - 通过映射另一个 Observable 返回一个 Observable

转载 作者:太空狗 更新时间:2023-10-29 17:33:26 24 4
gpt4 key购买 nike

我正在尝试映射一个 observable,从我返回的 observable 中获取一个值,然后将该值提供给另一个 observable 并返回该结果。这是我目前所拥有的:

  getJobsByUser(user: User): Observable<Job[]> {
return this.getUsersGroupsAsObservable(user.uid, 'contacts').map(groups => {
groups.map(group => {
this.getJobsbyGroup(group.id);
});
});

getJobsbyGroup(groupId: string): Observable<Job[]> {
return this.afs
.collection<Job>('jobs', ref => ref.where(`group.${groupId}`, '==', true))
.valueChanges();
}

getUsersGroupsAsObservable(
userId: string,
type: string = 'users',
): Observable<Group[]> {
return this.afs
.collection<Group>('groups', ref =>
ref.where(`${type}.${userId}`, '==', true),
)
.valueChanges();
}

问题是 typescript 表明我的 getJobsByUser 函数将返回一个类型为:void 的可观察对象。当我在我的模板上输出它时,我什么也得不到或未定义。我觉得我需要使用 switchMap 但我对 rx/js 有点模糊。我不确定如何返回 Job[] 类型的 Observable

更新:在@Pranay Rana 的帮助下,我现在返回数组,并且可以获得这样的第一个值:

  getJobsByUser(user: User): Observable<Job[]> {
return this.getUsersGroupsAsObservable(user.uid, 'contacts').pipe(
mergeMap(groups => {
// returns an array of groups - we need to map this
return this.getJobsbyGroup(groups[0].id); // works with the first value - do we need another map here?
}),
);
}

更新 2:我已经设法从 firestore 取回了一些数据,但它发出了多个可观察值而不是组合流:

this.fb.getUsersGroupsAsObservable(user.uid, 'contacts')
.switchMap(groups => {
return groups.map(group => this.fb.getJobsbyGroup(group.id));
})
.subscribe(res => {
console.log(res);
// this emits multiple observables rather than one
this.job$ = res;
});

最佳答案

以下方法详细讨论:Way to handle Parallel Multiple Requests

下面的方法利用了mergemap

getJobsByUser(user: User) {
return this.getUsersGroupsAsObservable(user.uid, 'contacts').pipe(
mergeMap(group => this.getJobsbyGroup( group.id))
);
}

callingfunction(){
const requests = this.getJobsByUser(this.user);
requests.subscribe(
data => console.log(data), //process item or push it to array
err => console.log(err));
}

你也可以使用forkJoin

getJobsByUser(user: User) {
return this.getUsersGroupsAsObservable(user.uid, 'contacts').pipe(
map(group => this.getJobsbyGroup( group.id))
);
}

callingfunction(){
const requests = forkJoin(this.getJobsByUser(this.user));
requests.subscribe(
data => console.log(data), //process item or push it to array
err => console.log(err));
}

关于angular - 通过映射另一个 Observable 返回一个 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50809542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com