(https://i.stack.imgur.com/2zm2w.png)(英文)
collectionData(queryRef).subscribe((data) => {
for (const each of data) {
this.getCourse(each.courseId)
.pipe(take(1))
.subscribe((courseData) => {
const course = courseData[0];
console.log(course);
this.getLecturer(course.lecturerId).pipe(take(1)).subscribe((res: any)=>{
const lecturer = res[0];
course.lecturerName = lecturer.lecturerName;
course.lecturerImageUrl = lecturer.lecturerImageUrl;
});
recentVisit.push(course);
});
}
});
嗨,我还是Angular的rxjs新手。我正在使用Angular Fire构建一个Ionic应用程序。我目前面临一些问题,我使用Firebase作为我的后端,我必须通过不同的集合来查询我的数据。例如,第一个订阅只获取用户课程注册数据,如courseId,progress...,第二个订阅将获取课程详细信息,第三个将获取讲师的详细信息。有人能给予一些建议如何避免使用嵌套订阅吗?因为很多人说不建议这样做。如果你能提供一些详细的解释,我将非常感激,因为我真的只知道rxjs的基础知识。
我尝试过concatMap,但它显示firebase错误(https://i.stack.imgur.com/6SOS0.png)]
collectionData(queryRef)
.pipe(
concatMap((res: any) => this.getCourse(res.courseId))
//concatMap((result2: any) => this.getLecturer(result2.lecturerId))
)
.subscribe((res) => {
console.log(res);
});
但实际上我也不确定我做得对不对,因为我真的不能理解concatMap是如何工作的。
2条答案
按热度按时间afdcj2ne1#
我创建了一个解决方案,通过执行以下操作来防止嵌套管道和多个显式订阅:
switchMap
和forkJoin
结合起来getMergedCourseDetails()
,以便保持主管道的平整unguejic2#
如果你使用嵌套的订阅,这意味着它将等待第一个订阅返回一个值,然后调用第二个订阅,如此类推。这会花费很多时间。你可以在这里使用forkJoin():
forkJoins等待所有3个Observable发出一次,并给出所有值。示例如下:https://www.learnrxjs.io/learn-rxjs/operators/combination/forkjoin